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

95

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

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

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

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

hash_jr90
источник
Можете ли вы разместить ссылку на документы, на которые вы ссылаетесь?
Don Roby
@don: Извините, это мои заметки лектора. Но ba__friend ответил на мой вопрос, и я тестирую его здесь: miraclesalad.com/webtools/md5.php , и его действительно только шестнадцатеричные символы, теперь это имеет для меня гораздо больше смысла. Проголосую за его ответ как за лучший ответ
hash_jr90
Я думаю, что в моем ответе это более подробно, чем в других. Если вы новичок в компьютерном программировании, задаете этот вопрос и хотите получить
Эван Кэрролл,
9
Это не глупый вопрос. Когда-то вы также не знали, сколько символов HEX представляет один байт.
Дэвид Клемпфнер
Быстрый python one liner для вычисления длины хэша в битах, ((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?
Корай Тугай
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
Эван Кэрролл,
9

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

Бретт Томас
источник
2

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

Eaolson
источник
2

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

Джек Эдмондс
источник
2

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

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

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

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

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

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

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

Дождь
источник