MD5 в число увеличится ли вероятность коллизии
Появилась задача преобразовать md5 hash в целое число. Так как диапазон букв a-f, на ум пришло следующее:
function numeric_hash($string) {
$converter = array(
'a' => 0,
'b' => 1,
'c' => 2,
'd' => 3,
'e' => 4,
'f' => 5
);
return strtr(md5($string), $converter);
}
echo numeric_hash('hello_world');
Вопрос: Возрастет ли от этого вероятность коллизий, по моей логике не должно, так как какая разница будет там b или 1, (по крайней мере я так думаю).
Данный хеш не будет использоваться в криптографических целях, а всего лишь как уникальный id.
Ответы (1 шт):
md5 - это 128 бит данных. Запись символами 0-9a-f - то есть в шестнадцатеричной системе счисления - лишь распространённая традиция. Вы можете без влияния на криптографическую стойкость использовать любую форму вывода, обеспечивающую однозначное преобразование. Можете использовать любой алфавит, хоть 128-символьную строку из букв А и Б для отображения состояния соответствующего бита - вы сохраните все 128 бит данных.
Однако если ваше преобразование выполняется с потерей данных, как например замена литеры a в шестнадцатеричном представлении на 0 - так же используемому в этом представлении - то вы теряете данные. Соответственно уменьшаете количество возможных вариантов и потому, конечно, увеличиваете число коллизий.
Появилась задача преобразовать md5 hash в целое число.
Это обычное преобразование систем счисления. Из шестнадцатеричной (или сразу двоичной при желании) в десятеричную. Для штатных функций PHP вроде base_convert или hexdec, впрочем, 128-битное число великовато. И вам нужно сделать (или взять готовую) пользовательскую реализацию. В комментариях к мануалу PHP по функции base_convert приведено несколько вариантов.