MD5 128 бит, но почему это 32 символа? - PullRequest
74 голосов
/ 11 июня 2011

Я прочитал несколько документов о md5, там написано, что он 128 бит, но почему он 32 символа?Я не могу вычислить символы.

  • 1 байт равен 8 битам
  • , если 1 символ равен 1 байту
  • , тогда 128 битов составляет 128/8 = 16 байтовверно?

РЕДАКТИРОВАТЬ:

SHA-1 выдает 160 бит, так сколько символов там?

Ответы [ 7 ]

92 голосов
/ 11 июня 2011

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

28 голосов
/ 16 апреля 2013

Я хотел объединить некоторые ответы в один пост.

Во-первых, не думайте о хеше MD5 как о символьной строке, а как о шестнадцатеричном числе.Следовательно, каждая цифра является шестнадцатеричной (0-15 или 0-F) и представляет четыре бита, а не восемь.

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

Хеши MD5 имеют длину 128 битов и обычно представлены 32 шестнадцатеричными цифрами.

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

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

Опять же, этот пост основан только на предыдущих ответах.

21 голосов
/ 12 января 2017

Шестнадцатеричный «символ» (полубайт) отличается от «символа»

Чтобы быть понятным в битах против байта, против символов.

  • 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], и он представляет обе половины байта (мы называем полубайт nibble ).

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

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

Таким образом, они явно отличаются, и я надеюсь, что это обеспечит наилучшее устранение различий.

19 голосов
/ 11 июня 2011

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

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

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

Возможно, вы думали о текстовых символах ASCII, которые являются 8 битами.

8 голосов
/ 11 июня 2011

Это 32 шестнадцатеричных символа - 1 шестнадцатеричный символ равен 4 битам.

2 голосов
/ 11 июня 2011

На самом деле это не символы, а шестнадцатеричные цифры.

2 голосов
/ 11 июня 2011

Это шестнадцатеричные цифры, а не символы.Одна цифра = 4 бита.

...