MD5 Hash и Base64 кодирование - PullRequest
15 голосов
/ 25 ноября 2010

Если у меня есть строка из 32 символов (хэш MD5), и я кодирую ее с помощью Base64, какова максимальная длина кодированной строки?

Ответы [ 2 ]

40 голосов
/ 08 ноября 2012

Значение MD5 составляет всегда 22 (полезных) символа длиной в формате Base64.Многие алгоритмы Base64 также добавляют 2 символа заполнения при кодировании хеша MD5, в результате чего общее количество символов достигает 24.Заполнение не добавляет полезной информации и может быть отброшено.Только первые 22 символа имеют значение.

Вот почему:

Хэш MD5 является 128-битным значением.Каждый символ в строке Base64 содержит 6 битов информации, поскольку для символа существует 64 возможных значения, и для достижения 64 требуется 6 степеней от 2. С 6 битами информации в каждом символе 21 символ имеет 126 битов информации,и 22 символа содержат 132 бита информации.Поскольку 128 бит не могут уместиться в 21 символ, но умещаются в 22 символа (с небольшим запасом места), 128-битное значение всегда будет представлено как 22 символа в Base64.

Примечание на отступе:

Я упоминал выше, что многие алгоритмы кодирования Base64 добавляют пару символов заполнения при кодировании значения MD5.Это потому, что Base64 представляет 3 байта информации в виде 4 символов.Поскольку MD5 имеет 16 байтов информации, многие алгоритмы кодирования Base64 добавляют «==» для обозначения того, что ввод 16 байтов был на 2 байта меньше следующего кратного 3, что было бы 18 байтами.Эти 2 знака равенства не добавляют никакой информации к строке и могут быть отброшены при хранении.

9 голосов
/ 25 ноября 2010

Согласно http://en.wikipedia.org/wiki/Base64

"Обратите внимание, что при вводе n байтов выход будет иметь длину (n + 2 - ((n + 2)% 3)) / 3 * 4 байта,который сходится к n * 4/3 или 1,33333n для большого n. "

Таким образом, это будет ((32 + 2 - (32 + 2)% 3)) / 3 * 4 = 34 - (34% 3) / 3 * 4 = (34 - 1) / 3 * 4 = 33/3 * 4 = 44 символа.

Вы всегда можете извлечь его в необработанном двоичном виде (128 бит) и кодировать егонепосредственно в базу 64, что означает преобразование 16 байтов вместо 32, которые становятся 24 байтами при кодировании базы 64.

...