MD5 — 128 бит, но почему 32 символа?

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

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

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

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


person hash_jr90    schedule 11.06.2011    source источник
comment
Можете ли вы опубликовать ссылку на документы, на которые вы ссылаетесь?   -  person Don Roby    schedule 11.06.2011
comment
@don: Извините, это мои заметки лектора. Но ba__friend ответил на мой вопрос, и я тестирую его здесь: miraclesalad.com/webtools/md5.php, и это действительно только шестнадцатеричные символы, теперь это имеет для меня гораздо больше смысла. Я проголосую за его ответ как лучший ответ   -  person hash_jr90    schedule 11.06.2011
comment
Я думаю, что мой ответ более подробно описывает это, чем любой другой. Если вы новичок в программировании и задаете этот вопрос и хотите получить исчерпывающий ответ   -  person Evan Carroll    schedule 12.01.2017
comment
Это не глупый вопрос. Когда-то вы также не знали, сколько символов HEX представляет один байт.   -  person David Klempfner    schedule 17.04.2018
comment
Быстрый python one liner для вычисления длины хэша в битах: ((1 << (n*4))-1).bit_length(), где n - длина хэша в шестнадцатеричном формате.   -  person Wouterr    schedule 09.03.2020


Ответы (9)


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

person ba__friend    schedule 11.06.2011
comment
1 байт представлен двузначным шестнадцатеричным числом, например 255 = ff. - person ba__friend; 11.06.2011
comment
поэтому 1 байт - это 2 символа, что означает, что 16 бит - это 2 символа, тогда 128/16 = 8. Значит, требуется 8 из 2 символов = 16 символов? Почему 32? - person Koray Tugay; 13.07.2014
comment
Потому что каждый шестнадцатеричный символ может быть представлен 4 битами. Итак, если это 128 бит, это 128/4 = 32 шестнадцатеричных символа. Несмотря на то, что каждый символ будет закодирован как utf8 или ascii, размер шестнадцатеричного представления составит 32 * 8 = 256 бит. - person Gaston Sanchez; 14.10.2014
comment
Это действительно плохой ответ. Мой ответ подробно описывает это: stackoverflow.com/a/41618070/124486 - person Evan Carroll; 12.01.2017
comment
@KorayTugay, поэтому 1 байт - это 2 символа, что означает, что 16 бит - это 2 символа - 1 байт! = 16 бит. - person David Klempfner; 17.04.2018

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

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

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

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

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

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

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

person RepentantFan    schedule 16.04.2013

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

Чтобы было ясно, что такое биты, байты и символы.

  • 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() мог хранить все это, вы бы увидели все строчные буквы, все прописные буквы, все знаки препинания и такие вещи, как ¡°ÀÐàð, пробелы (перевод строки и табуляция) и управляющие символы (которые вы даже не видно, и многие из них не используются).

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

person Evan Carroll    schedule 12.01.2017
comment
Что это значит? В каком порядке на самом деле зависит спецификация или платформа? Хотелось бы, чтобы это объяснили немного больше. - person KumarM; 12.01.2019
comment
@KumarM Я собираюсь удалить это, потому что я не думаю, что это вообще имеет отношение к разговору, и это плохо сформулировано. - person Evan Carroll; 12.01.2019

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

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

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

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

person Wiseguy    schedule 11.06.2011
comment
большое спасибо .. теперь у меня в голове гораздо более четкая картина !! - person hash_jr90; 11.06.2011
comment
примечание: ascii-charset содержит непечатаемые символы. - person RLEE; 13.09.2016
comment
Я попытался разбить это немного более явно stackoverflow.com/a/41618070/124486 - person Evan Carroll; 12.01.2017

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

person Brett Thomas    schedule 11.06.2011

Одна шестнадцатеричная цифра = 1 полубайт (четыре бита)

Две шестнадцатеричные цифры = 1 байт (восемь бит).

MD5 = 32 шестнадцатеричных цифры

32 шестнадцатеричных цифры = 16 байтов ( 32 / 2)

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

То же самое относится и к SHA-1, за исключением того, что он состоит из 40 шестнадцатеричных цифр.

Надеюсь, это поможет.

person Rain    schedule 11.09.2019

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

person eaolson    schedule 11.06.2011

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

person Jack Edmonds    schedule 11.06.2011

Для ясности скопируйте рассчитанное MD5 128-битное хеш-значение в преобразователь двоичного кода в шестнадцатеричный и посмотрите длину шестнадцатеричное значение. Вы получите 32 шестнадцатеричных символа.

person Alok Singh    schedule 14.07.2021