To pytanie ma już odpowiedź tutaj:
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?
Odpowiedzi:
Domyślnie
echo
zawiera 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-n
flagi:Wynik:
Widzieć:
help echo
lub z printf:
źródło
echo -n
może-n
odbić się echem, jeśli ich system Linux używa uproszczonego Busyboksa.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,hello
z nowym wierszem wypisuje dokładnie MD5, który otrzymywałeś wcześniej. Użycie-n
pomija znak nowej linii, a następnie daje oczekiwany wynik.Edytuj :
Możesz to zobaczyć wyraźnie, jeśli wypiszesz go
hexdump
, co pokazuje szesnastkowy bajt tam.Zobacz
0a
(\n
) na końcu ciąguFunkcja
-n
echo nie umieszcza nowej linii (\n
) na końcuTeraz z pustym ciągiem
Tylko znak nowej linii
Pusty ciąg, więc
hexdump
nie pokazuje danych wyjściowychźródło
echo hello
iecho -n hello
dohexdump -C
odpowiednio;)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żyjprintf
zamiast 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"
.