Почему SHA-1 хэш длиной 40 символов, если он всего 160 бит? - PullRequest
37 голосов
/ 14 сентября 2010

Название вопроса говорит само за себя. Я исследовал SHA-1, и в большинстве мест я вижу его длиной 40 шестнадцатеричных символов, который для меня составляет 640 бит. Разве это не может быть представлено так же просто с 10 шестнадцатеричных символов 160 бит = 20 байт И один шестнадцатеричный символ может представлять 2 байта, верно? Почему это вдвое дольше, чем нужно? Чего мне не хватает в моем понимании.

А SHA-1 не может быть даже 5 или менее символами, если используется Base32 или Base36?

Ответы [ 6 ]

83 голосов
/ 14 сентября 2010

Один шестнадцатеричный символ может представлять только 16 различных значений, то есть 4 бита. (16 = 2 4 )

40 & раз; 4 = 160.


И нет, вам нужно намного больше 5 символов в base-36.

Всего существует 2 160 различных хэшей SHA-1.

2 160 = 16 40 , поэтому это еще одна причина, по которой нам нужно 40 шестнадцатеричных цифр.

Но 2 160 = 36 160 log 36 2 = 36 30.9482 ... , поэтому вам по-прежнему нужно 31 символ, используя база-36.

12 голосов
/ 14 сентября 2010

Я думаю, что путаница ОП происходит из-за строки , представляющей хеш SHA1, занимающей 40 байтов (по крайней мере, если вы используете ASCII), что равно 320 битам (не 640 битам).

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

Вы можете использовать base64, но в этом случае вам потребуется около 27-28 байт (или символов) вместо 40 (см. эта страница ).

9 голосов
/ 14 сентября 2010

На 8-битный байт приходится два шестнадцатеричных символа, а не два байта на шестнадцатеричный.

Если вы работаете с 8-битными байтами (как в определении SHA-1), то шестнадцатеричный символ кодирует один верхний или нижний 4-битный полубайт в байте. Таким образом, для полного байта требуется два таких символа.

5 голосов
/ 14 сентября 2010

2 шестнадцатеричных символа составляют диапазон от 0 до 255, то есть 0x00 == 0 и 0xFF == 255. Таким образом, 2 шестнадцатеричных символа имеют 8 бит, что составляет 160 бит для вашего дайджеста SHA.

4 голосов
/ 19 июля 2017

Мой ответ отличается от предыдущих в моей теории только ТОЧНЫМ происхождением путаницы ОП, а также с детскими шагами, которые я приведу для выяснения.

A символ занимает различное количество байтов в зависимости от используемой кодировки ( см. Здесь ). В наши дни существует несколько контекстов, когда мы используем 2 байта на символ, например, при программировании на Java (, вот почему ). Таким образом, 40 символов Java будут равны 80 байтам = 640 битам, вычисление OP, и 10 символов Java действительно будут инкапсулировать нужное количество информации для хэша SHA-1.

В отличие от тысяч возможных символов Java, однако, есть только 16 различных шестнадцатеричных символов , а именно 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E и F. Но это не то же самое, что символы Java, и занимают гораздо меньше места, чем кодировки символов Java от 0 до 9 и от A до F. Это символы, обозначающие все возможные значения, представленные всего 4 бита:

0  0000    4  0100    8  1000    C  1100
1  0001    5  0101    9  1001    D  1101
2  0010    6  0110    A  1010    E  1110
3  0011    7  0111    B  1011    F  1111

Таким образом, каждый шестнадцатеричный символ составляет только половину байта, а 40 шестнадцатеричных символов дают нам 20 байтов = 160 битов - длину хеша SHA-1.

3 голосов
/ 13 июня 2014

SHA-1 составляет 160 бит

Это означает 20 байтов = 40 шестнадцатеричных символов (2 шестнадцатеричных символа на байт)

...