MD5 - 128 біт, але чому це 32 символи?


95

Я прочитав деякі документи про md5, там говорилося, що його 128 біт, але чому це 32 символи? Я не можу обчислити символи.

  • 1 байт - це 8 бітів
  • якщо 1 символ - 1 байт
  • тоді 128 біт - це 128/8 = 16 байт, правда?

РЕДАГУВАТИ:

SHA-1 видає 160 біт, тож скільки символів?


Чи можете ви розмістити посилання на документи, на які ви посилаєтесь?
Дон Робі,

@don: Вибачте, це зазначає мій лектор. Але ba__friend відповів на моє запитання, і я тестую його тут: miraclesalad.com/webtools/md5.php , і лише його справді шістнадцяткові символи, зараз для мене це має набагато більше сенсу. Я проголосую його відповідь як найкращу відповідь
hash_jr90


9
Це не безглузде питання. Колись ви також не знали, скільки шістнадцяткових символів представляє один байт.
Девід Клемпфнер

Швидкий вкладиш python для обчислення бітової довжини хешу - це ((1 << (n*4))-1).bit_length()де n - довжина хешу в шістнадцятковій
Wouterr

Відповіді:


107

32 символи як шістнадцяткове представлення, це 2 символи на байт.


1
1 байт представлений двозначним шістнадцятковим числом, наприклад 255 = ff.
ba__friend

1
отже, 1 байт - це 2 символи, що означає, що 16 бітів - це 2 символи, тоді 128/16 = 8. Тоді 8 з 2 символів = 16 символів потрібно тоді? Чому 32?
Koray Tugay

15
Оскільки кожен шістнадцятковий символ може бути представлений 4 бітами. Отже, якщо це 128 біт, це 128/4 = 32 шістнадцяткові символи. Навіть незважаючи на те, що кожен "char" буде закодований як utf8 або ascii, що зробить розмір шестнадцатиричного представлення 32 * 8 = 256 біт.
Гастон Санчес,

2
Це справді погана відповідь. Моя відповідь вкладається в подробиці з цього приводу: stackoverflow.com/a/41618070/124486
Еван Керролл

@KorayTugay "отже, 1 байт - це 2 символи, що означає, що 16 біт - це 2 символи" - 1 байт! = 16 біт.
Девід Клемпфнер

36

Я хотів, щоб деякі відповіді були обговорені в одному дописі.

По-перше, не думайте про хеш MD5 як про рядок символів, а як про шістнадцяткове число. Отже, кожна цифра є шістнадцятковою (0-15 або 0-F) і представляє чотири біти, а не вісім.

Беручи до уваги, що один байт або вісім бітів представлені двома шістнадцятковими цифрами, наприклад b ' 1111 1111' = 0xFF= 255.

Хеші MD5 мають довжину 128 бітів і, як правило, представлені 32 шістнадцятковими цифрами.

Хеші SHA-1 мають довжину 160 бітів і, як правило, представлені 40 шістнадцятковими цифрами.

Для сім'ї SHA-2, я думаю, довжина хешу може бути однією з попередньо визначених наборів. Тож SHA-512 може бути представлений 128 шістнадцятковими цифрами.

Знову ж таки, ця публікація лише заснована на попередніх відповідях.


26

Шістнадцятковий "персонаж" (гризти) відрізняється від "символу"

Щоб бути чітким щодо бітів проти байтів, проти символів.

  • 1 байт - це 8 бітів (для наших цілей)
  • 8 біт забезпечує 2**8можливі комбінації: 256 комбінацій

Коли ви дивитесь на шістнадцятковий символ,

  • 16 комбінацій [0-9] + [a-f]: повний асортимент0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
  • 16 менше 256, тому один шістнадцятковий символ не зберігає байт.
  • 16 означає 2**4: це означає, що один шістнадцятковий символ може зберігати 4 біти в байті (половина байта).
  • Отже, два шістнадцяткові символи можуть зберігати 8 бітів, 2**8комбінації.
  • Байт, представлений як шістнадцятковий символ, є [0-9a-f][0-9a-f]і представляє обидві половини байта (ми називаємо напівбайт гризею ).

Коли ви дивитесь на звичайний однобайтовий символ, (тут ми повністю пропустимо багатобайтові та широкі символи)

  • Він може зберігати набагато більше 16 комбінацій.
  • Можливості персонажа визначаються кодуванням. Наприклад, ISO 8859-1, який зберігає цілий байт, зберігає все це
  • Все це займає весь 2**8асортимент.
  • Якщо шістнадцятковий символ у файлі md5()може зберігати все це, ви побачите всі малі літери, усі великі літери, усі розділові знаки та подібні ¡°ÀÐàð, пробіли типу (нові рядки та вкладки) та контрольні символи (які ви можете ' навіть не бачу, і багато з яких не використовуються).

Отже, вони явно відрізняються, і я сподіваюся, що це забезпечує найкращий збір відмінностей.


1
Що насправді означає це "В якому порядку насправді залежить специфікація чи платформа"? Хотілося б побачити це ще трохи.
KumarM

@KumarM Я збираюся видалити це, оскільки я не думаю, що це насправді взагалі стосується розмови, і це погано сформульовано.
Еван Керролл,

22

MD5 дає шістнадцяткові цифри (0-15 / 0-F), тому вони складають чотири біти кожна. 128/4 = 32 символи.

SHA-1 також дає шістнадцяткові цифри (0-15 / 0-F), тому 160/4 = 40 символів.

(Оскільки це математичні операції, вихідні дані більшості хеш-функцій зазвичай представляються як шістнадцяткові цифри.)

Ви, мабуть, думали про текстові символи ASCII, які складають 8 біт.


велике спасибі .. зараз у мене в голові набагато чіткіше зображення !!
hash_jr90

Примітка: ascii-charset містить символи, що не друкуються.
Рой Лі

Я намагався розбити це трохи більш явно stackoverflow.com/a/41618070/124486
Еван Керролл




2

Одна шістнадцяткова цифра = 1 гризок (чотирибітні)

Дві шістнадцяткові цифри = 1 байт (вісім бітів)

MD5 = 32 шістнадцяткові цифри

32 шістнадцяткові цифри = 16 байт (32/2)

16 байт = 128 біт (16 * 8)

Те саме стосується SHA-1, за винятком того, що він має 40 шістнадцяткових цифр.

Сподіваюся, це допоможе.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.