MD5 ma 128 bitów, ale dlaczego ma 32 znaki?

99

Czytałem kilka dokumentów o md5, napisano, że ma 128 bitów, ale dlaczego ma 32 znaki? Nie mogę obliczyć znaków.

  • 1 bajt to 8 bitów
  • jeśli 1 znak to 1 bajt
  • to 128 bitów to 128/8 = 16 bajtów, prawda?

EDYTOWAĆ:

SHA-1 produkuje 160 bitów, więc ile jest znaków?

hash_jr90
źródło
Czy możesz opublikować link do dokumentów, do których się odwołujesz?
Don Roby
@don: Przepraszam, to moje notatki dla wykładowcy. Ale ba__friend odpowiedział na moje pytanie i testuję to tutaj: miraclesalad.com/webtools/md5.php , a jego naprawdę są tylko znaki szesnastkowe, teraz ma to dla mnie znacznie więcej sensu. Zagłosuję na jego odpowiedź jako najlepszą
hash_jr90
Myślę, że moja odpowiedź jest bardziej szczegółowa niż jakiekolwiek inne. Jeśli jesteś nowy w programowaniu i zadajesz to pytanie i chcesz uzyskać bezpośrednią odpowiedź
Evan Carroll
9
To nie jest głupie pytanie. Kiedyś nie wiedziałeś też, ile znaków HEX reprezentuje jeden bajt.
David Klempfner
Szybka jedna linijka w Pythonie do obliczenia długości bitowej skrótu to ((1 << (n*4))-1).bit_length()gdzie n jest długością skrótu w systemie szesnastkowym
Wouterr

Odpowiedzi:

110

32 znaki jako reprezentacja szesnastkowa, czyli 2 znaki na bajt.

ba__friend
źródło
1
1 bajt jest reprezentowany przez dwucyfrową liczbę szesnastkową, na przykład 255 = ff.
ba__friend
1
więc 1 bajt to 2 znaki, co oznacza, że ​​16 bitów to 2 znaki, to 128/16 = 8. Czy więc potrzeba 8 z 2 znaków = 16 znaków? Dlaczego 32?
Koray Tugay
18
Ponieważ każdy znak szesnastkowy może być reprezentowany przez 4 bity. Więc jeśli ma 128 bitów, to 128/4 = 32 znaki szesnastkowe. Mimo że każdy „znak” zostanie zakodowany jako utf8 lub ascii, co spowoduje, że rozmiar reprezentacji szesnastkowej 32 * 8 = 256 bitów.
Gaston Sanchez
2
To naprawdę kiepska odpowiedź. Moja odpowiedź zawiera szczegóły na ten temat: stackoverflow.com/a/41618070/124486
Evan Carroll
@KorayTugay "więc 1 bajt to 2 znaki, co oznacza, że ​​16 bitów to 2 znaki" - 1 bajt! = 16 bitów.
David Klempfner
37

Chciałem podsumować niektóre odpowiedzi w jednym poście.

Po pierwsze, nie myśl o skrócie MD5 jako o ciągu znaków, ale o liczbie szesnastkowej. Dlatego każda cyfra jest cyfrą szesnastkową (0-15 lub 0-F) i reprezentuje cztery bity, a nie osiem.

Idąc dalej, jeden bajt lub osiem bitów jest reprezentowanych przez dwie cyfry szesnastkowe, np. B ' 1111 1111' = 0xFF= 255.

Skrót MD5 ma 128 bitów długości i jest generalnie reprezentowany przez 32 cyfry szesnastkowe.

Skrót SHA-1 ma długość 160 bitów i jest generalnie reprezentowany przez 40 cyfr szesnastkowych.

Myślę, że dla rodziny SHA-2 długość skrótu może być jednym z wcześniej określonego zestawu. Zatem SHA-512 można przedstawić za pomocą 128 cyfr szesnastkowych.

Ponownie, ten post jest oparty tylko na poprzednich odpowiedziach.

RepentantFan
źródło
27

„Znak” szesnastkowy (półbajt) różni się od „znaku”

Aby wyjaśnić kwestię bitów, bajtów, znaków.

  • 1 bajt to 8 bitów (do naszych celów)
  • 8 bitów zapewnia 2**8możliwe kombinacje: 256 kombinacji

Kiedy patrzysz na znak szesnastkowy,

  • 16 kombinacji [0-9] + [a-f]: pełen zakres0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
  • 16 to mniej niż 256, więc jeden znak szesnastkowy nie przechowuje bajtu.
  • 16 to 2**4: to znaczy, że jeden znak szesnastkowy może przechowywać 4 bity w bajcie (pół bajtu).
  • Dlatego dwa znaki szesnastkowe mogą przechowywać 8 bitów, 2**8kombinacje.
  • Bajt reprezentowany jako znak szesnastkowy to [0-9a-f][0-9a-f]i który reprezentuje obie połowy bajtu (pół bajta nazywamy półbajtem ).

Kiedy patrzysz na zwykły znak jednobajtowy (całkowicie pominiemy tutaj znaki wielobajtowe i szerokie)

  • Może przechowywać znacznie więcej niż 16 kombinacji.
  • Możliwości znaku są określane przez kodowanie. Na przykład ISO 8859-1, które przechowuje cały bajt, przechowuje wszystkie te rzeczy
  • Wszystko to obejmuje cały 2**8zakres.
  • Gdyby znak szesnastkowy w an md5()mógł przechowywać to wszystko, zobaczyłbyś wszystkie małe litery, wszystkie wielkie litery, wszystkie znaki interpunkcyjne i inne elementy, takie jak ¡°ÀÐàðbiałe spacje (nowe linie i tabulatory) oraz znaki kontrolne (które możesz nawet nie widzę, a wiele z nich nie jest używanych).

Więc są one wyraźnie różne i mam nadzieję, że to najlepsze zestawienie różnic.

Evan Carroll
źródło
1
Co właściwie oznacza to „W jakiej kolejności zależy od specyfikacji lub platformy”? Chciałbym, aby to wyjaśniono nieco dokładniej.
KumarM
@KumarM Mam zamiar to usunąć, ponieważ wydaje mi się, że nie ma to żadnego znaczenia dla rozmowy i jest źle sformułowane.
Evan Carroll,
23

MD5 daje cyfry szesnastkowe (0-15 / 0-F), więc każda z nich ma cztery bity. 128/4 = 32 znaki.

SHA-1 daje również cyfry szesnastkowe (0-15 / 0-F), więc 160/4 = 40 znaków.

(Ponieważ są to operacje matematyczne, wynik większości funkcji haszujących jest zwykle reprezentowany jako cyfry szesnastkowe).

Prawdopodobnie myślałeś o znakach tekstowych ASCII, które mają 8 bitów.

Mądry gość
źródło
dziękuję bardzo… mam teraz dużo wyraźniejszy obraz w mojej głowie !!
hash_jr90
uwaga: ascii-charset zawiera symbole niedrukowalne.
Roy Lee,
Próbowałem to trochę bardziej wyraźnie wyjaśnić stackoverflow.com/a/41618070/124486
Evan Carroll
9

To 32 znaki szesnastkowe - 1 znak szesnastkowy to 4 bity.

Brett Thomas
źródło
3

Jedna cyfra szesnastkowa = 1 półbajt (cztery bity)

Dwie cyfry szesnastkowe = 1 bajt (osiem bitów)

MD5 = 32 cyfry szesnastkowe

32 cyfry szesnastkowe = 16 bajtów (32/2)

16 bajtów = 128 bitów (16 * 8)

To samo dotyczy SHA-1, z wyjątkiem tego, że ma 40 cyfr szesnastkowych.

Mam nadzieję, że to pomoże.

Deszcz
źródło
2

To są cyfry szesnastkowe, a nie znaki. Jedna cyfra = 4 bity.

eaolson
źródło
2

W rzeczywistości nie są to znaki, są to cyfry szesnastkowe.

Jack Edmonds
źródło