Wartość skrótu MD5 różni się od Bash i PHP [duplikat]


60

Próbowałem wygenerować sumę MD5 (przy użyciu md5sum) ciągu „hello”. Wypróbowałem różne metody jako narzędzie md5sum w Linuksie, funkcję MD5 () PHP, a także różne internetowe translatory tekstu na md5sum.

echo "hello" | md5sum

i

echo "hello" > file && md5sum file

Dał wynik b1946ac92492d2347c6235b4d2611184. Jednak funkcja md5 () PHP i prawie wszystkie generatory online dały wynik 5D41402ABC4B2A76B9719D911017C592.

Jaki jest powód?


38
echo -n „hello”
Martin York

Odpowiedzi:


80

Domyślnie echozawiera znak nowej linii na końcu wyniku. Jednak PHP i używane strony internetowe nie zawierają nowej linii. Aby ukryć znak nowej linii, użyj -nflagi:

echo -n "hello" | md5sum

Wynik:

5d41402abc4b2a76b9719d911017c592 -

Widzieć: help echo


lub z printf:

printf "%s" "hello" | md5sum

Sugerowałbym pokazanie bardziej kompatybilnej formy przed tą, która opiera się na zachowaniu nieokreślonym przez POSIX.
Charles Duffy

Dziękuję Ci. Wolę najpierw pokazać problem na własnym przykładzie i zachowaniu echa.
Cyrus

7
O ile nie znasz systemu operacyjnego OP, nie wiesz, że zmodyfikowana wersja „własnego przykładu” faktycznie będzie działać. echo -nmoże -nodbić się echem, jeśli ich system Linux używa uproszczonego Busyboksa.
Charles Duffy

Znam system operacyjny OP.
Cyrus

Podają swoje jądro, ale gdzie mówią więcej?
Charles Duffy

100

Odpowiedź @ Cyrus jest dokładnie na tym, jak rozwiązać ten problem - aby wyjaśnić, gdy użyjesz echo, wyświetli nowy wiersz na końcu łańcucha. Jak widać na tym wyjściu online, helloz nowym wierszem wypisuje dokładnie MD5, który otrzymywałeś wcześniej. Użycie -npomija znak nowej linii, a następnie daje oczekiwany wynik.

wprowadź opis zdjęcia tutaj

Edytuj :

Możesz to zobaczyć wyraźnie, jeśli wypiszesz go hexdump, co pokazuje szesnastkowy bajt tam.

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

Zobacz 0a( \n) na końcu ciągu

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

Funkcja -necho nie umieszcza nowej linii ( \n) na końcu

Teraz z pustym ciągiem

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

Tylko znak nowej linii

$ echo -n  "" | hd

Pusty ciąg, więc hexdumpnie pokazuje danych wyjściowych


2
Byłoby bardziej interesujące rury echo helloi echo -n hellodo hexdump -Codpowiednio;)
Tom Yan

19
Ja odradzam echo -n, ponieważ jest nietypowa i niekonsekwentnie obsługiwane (patrz Single Unix spececho i bardziej szczegółowy katalog niekompatybilności Sven Mascheck ). Jeśli chcesz, aby działał konsekwentnie, użyj printfzamiast tego; jest nieco bardziej skomplikowany w użyciu (musisz podać ciąg formatu oprócz danych, które chcesz wydrukować), ale IMO warto, aby uniknąć problemów. W takim przypadku załatwi sprawę printf "%s" "hello".
Gordon Davisson
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.