MD5 karma değeri Bash ve PHP'den farklıdır [duplicate]


60

Bu sorunun zaten burada bir cevabı var:

Bir dizinin MD5 toplamını (md5sum kullanarak) "merhaba" oluşturmaya çalıştım . Linux'ta md5sum aracı, PHP'nin MD5 () işlevi ve md5sum çevirmenlerine çeşitli çevrimiçi metinler gibi farklı yöntemler denedim.

echo "hello" | md5sum

ve

echo "hello" > file && md5sum file

Sonucu verdi b1946ac92492d2347c6235b4d2611184. Ancak, PHP'nin md5 () işlevi ve hemen hemen tüm çevrimiçi üreticiler çıktı verdi 5D41402ABC4B2A76B9719D911017C592.

Nedeni ne?


38
yankı -n "merhaba"
Martin York

Yanıtlar:


80

Varsayılan olarak, echoçıktı sonunda bir yeni satır karakteri içerir. Ancak, PHP ve kullandığınız çevrimiçi siteler yeni satırı içermez. Yeni satır karakterini bastırmak için -nbayrağı kullanın :

echo -n "hello" | md5sum

Çıktı:

5d41402abc4b2a76b9719d911017c592 -

Görmek: help echo


veya printf ile:

printf "%s" "hello" | md5sum

POSIX tarafından belirtilmeyen davranışa dayanan formdan önce daha uyumlu bir form gösterilmesini öneririm .
Charles Duffy

Teşekkür ederim. Sorunu ilk önce kendi örneği ve yankı davranışı ile göstermeyi tercih ederim.
Cyrus

7
OP'nin işletim sistemini bilmiyorsanız, "kendi örneklerinin" değiştirilmiş sürümünün gerçekten işe yarayacağını bilmiyorsunuz. Linux soyulmuş bir Busybox kullanıyorsa echo -nyankı -nyapabilir.
Charles Duffy

OP'nin işletim sistemini biliyorum.
Cyrus

Çekirdeğini belirtirler, ama bundan daha fazlasını nerede söylüyorlar?
Charles Duffy

100

@ Cyrus'un cevabı tam olarak bunun nasıl çözüleceğine işaret ediyor - açıklamak, echoonu kullanırken dizenin sonunda yeni bir satır çıkacak. Bu çevrimiçi çıktıda görebileceğiniz gibi, hellonewline ile daha önce aldığınız MD5 çıktı. Kullanmak -n, yeni satırı bastırır ve daha sonra beklediğiniz sonucu verir.

görüntü tanımını buraya girin

Düzenle :

Çıktısını alırsanız, açıkça görebiliyorsunuz hexdump, ki burada baytların onaltılık sayısını gösterir.

$ echo "str_example" | hd
00000000  73 74 72 5f 65 78 61 6d  70 6c 65 0a              |str_example.|

Dizenin sonundaki 0a( \n) bölümüne bakın.

$ echo -n "str_example" | hd
00000000  73 74 72 5f 65 78 61 6d  70 6c 65                 |str_example|

-nYankı ile \nsonuna yeni bir satır ( ) koymaz

Şimdi boş bir dizeyle

$ echo  "" | hd
00000000  0a                                                |.|

Sadece Yeni Çizgi karakteri

$ echo -n  "" | hd

Boş dize, yani hexdumpçıktı olmadığını gösterir


2
Boruya daha ilginç olurdu echo hellove echo -n hellohiç hexdump -C); sırasıyla
Tom Yan

19
Ben karşı tavsiye echo -no standart olmayan var ve tutarsız (bkz desteklenen beri, Tek Unix Spececho ve Sven Mascheck tarafından uyumsuzluklar daha detaylı katalog ). Tutarlı çalışmasını istiyorsanız, printfonun yerine kullanın; Kullanımı biraz daha karmaşıktır (yazdırılmasını istediğiniz verilere ek olarak bir biçim dizgisi belirtmeniz gerekir), ancak sorunlardan kaçınmak için IMO buna değer. Bu durumda, printf "%s" "hello"hile yapacak.
Gordon Davisson,
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.