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 приведено несколько вариантов.

→ Ссылка