MD5 128 бит, но почему это 32 символа?
Я прочитал несколько документов о md5, он сказал, что его 128 бит, но почему это 32 символа? Я не могу вычислить символы.
- 1 байт равен 8 битам
- если 1 символ равен 1 байту
- тогда 128 бит это 128/8 = 16 байтов, верно?
РЕДАКТИРОВАТЬ:
SHA-1 выдает 160 битов, так сколько там символов?
9 ответов
32 символа в шестнадцатеричном представлении, то есть 2 символа на байт.
Я хотел обобщить некоторые ответы в одном посте.
Во-первых, не думайте о хеше MD5 как о символьной строке, а как о шестнадцатеричном числе. Следовательно, каждая цифра является шестнадцатеричной (0-15 или 0-F) и представляет четыре бита, а не восемь.
Кроме того, один байт или восемь битов представлены двумя шестнадцатеричными цифрами, например, b'1111 1111
знак равно 0xFF
знак равно 255
,
Хеши MD5 имеют длину 128 бит и обычно представлены 32 шестнадцатеричными цифрами.
Хэши SHA-1 имеют длину 160 битов и обычно представлены 40 шестнадцатеричными цифрами.
Я думаю, что для семейства SHA-2 длина хэша может быть одной из заранее определенных. Таким образом, SHA-512 может быть представлен 128 шестнадцатеричными цифрами.
Опять же, этот пост основан только на предыдущих ответах.
Шестнадцатеричный "персонаж" (клев) отличается от "персонажа"
Чтобы было понятно, биты против байта, против символов.
- 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]
и это представляет обе половины байта (мы называем полубайта полубайтом). В каком порядке зависит спецификация или платформа:0F
может представлять либо00001111
, или же11110000
,
Когда вы смотрите на обычный однобайтовый символ (здесь мы полностью пропустим многобайтовые и широкие символы)
- Он может хранить более 16 комбинаций.
- Возможности персонажа определяются кодировкой. Например, ISO 8859-1, который хранит весь байт, хранит все эти вещи
- Все это занимает весь
2**8
спектр. - Если шестнадцатеричный символ в
md5()
может хранить все это, вы увидите все строчные буквы, все заглавные буквы, все знаки пунктуации и тому подобное¡°ÀÐàð
, пробельные символы (новые строки и вкладки) и управляющие символы (которых вы даже не видите, и многие из которых не используются).
Так что они явно разные, и я надеюсь, что это поможет лучше понять различия.
MD5 дает шестнадцатеричные цифры (0-15 / 0-F), поэтому они имеют четыре бита каждая. 128 / 4 = 32 символа.
SHA-1 также дает шестнадцатеричные цифры (0-15 / 0-F), поэтому 160 / 4 = 40 символов.
(Поскольку это математические операции, вывод большинства хеш-функций обычно представляется в виде шестнадцатеричных цифр.)
Вы, вероятно, думали о текстовых символах ASCII, которые являются 8 битами.
Одна шестнадцатеричная цифра = 1 полубайт (четыре бита)
Две шестнадцатеричные цифры = 1 байт (восемь бит)
MD5 = 32 шестнадцатеричных цифры
32 шестнадцатеричных цифры = 16 байтов (32/2)
16 байт = 128 бит (16 * 8)
То же самое относится к SHA-1, за исключением того, что он состоит из 40 шестнадцатеричных цифр.
Надеюсь, это поможет.
Это 32 шестнадцатеричных символа - 1 шестнадцатеричный символ равен 4 битам.
Это шестнадцатеричные цифры, а не символы. Одна цифра = 4 бита.
Для ясности скопируйте 128-битное хеш-значение, рассчитанное с помощью MD5, в преобразователь двоичного кода в шестнадцатеричный и посмотрите длину шестнадцатеричного значения. Вы получите 32 шестнадцатеричных символа.