Python tarafından oluşturulan bir MD5 karması, kabukta echo ve md5sum kullanılarak oluşturulanlardan neden farklı?


109

Bir Python MD5 hash'i, kabukta md5sum komutu tarafından oluşturulandan farklıdır. Neden?

>>> import hashlib
>>> h = hashlib.md5()
>>> h.update("mystringforhash")
>>> print h.hexdigest()
86b6423cb6d211734fc7d81bbc5e11d3 # Result from Python


$ echo mystringforhash | md5sum
686687dd68c5de717b34569dbfb8d3c3  - # Result on the shell

Yanıtlar:


198

echoBir ekler \ngenellikle çizgiler kabuğunda bir satır aralığı ile biten değil istemiyoruz çünkü (istem çok soldaki başlamaz eğer gerçekten çirkin görünüyor). Sondaki satır kesmesini atlamak
için -nbağımsız değişkeni kullanın ve python betiğinizle aynı sağlama toplamını yazdıracaktır:

> echo -n mystringforhash | md5sum
86b6423cb6d211734fc7d81bbc5e11d3  -

53
Aslında bu, insanlara genellikle kabuk betiklerinde daha iyi olduğu düşünülen işler için kabuk betikleri yerine daha fazla Python veya daha yüksek seviye dil kullanmalarını söylediğimde kullandığım en büyük örneklerden biri. Karışık veri ve kodun doğası ve her komut için farklı bir sözdizimi, kabuk komut dosyalarını görünmez bir şekilde hataya açık hale getirir.
jsbueno

7
Verilen tek şey "bir kabuk" echoise, uygulanabilir bir -nbayrağa sahip olacağınıza güvenemezsiniz . POSIX şunları söyler echo: "İlk işlenen ise -nveya işlenenlerden herhangi biri bir <backslash>karakter içeriyorsa , sonuçlar uygulama tanımlıdır." (kaynak: pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html ). printfBunun yerine kullanın .
Mikko Rantalainen

Sorun echo'da değil, md5sum'da (şimdi Mac'te md5) ve sonuna \ n ekleyen
shasum'da

@Punnerud: Hayır. Burada çıktısının md5sumönemi yok. Giriş yapar. Ve olmadan -n, echo farklı bir hash ile sonuçlanan bir satır sonu ekler.
ThiefMaster
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.