Есть ли разница в частоте конфликтов между одним 32-битным хешем и двумя 16-битными?

Я работаю над системой, в которой хеш-коллизии были бы проблемой. По сути, существует система, которая ссылается на элементы в структуре хеш-таблица + дерево. Однако рассматриваемая система сначала компилирует текстовые файлы, содержащие пути в структуре, в двоичный файл, содержащий вместо этого хешированные значения. Это сделано из соображений производительности. Однако из-за этого коллизии очень плохи, поскольку структура не может хранить 2 элемента с одинаковым значением хеш-функции; часть, запрашивающая элемент, не будет иметь достаточно информации, чтобы знать, какой из них ему нужен.

Моя первоначальная мысль заключалась в том, что 2 хэша, либо с использованием 2 разных алгоритмов, либо с использованием одного и того же алгоритма дважды, с 2 солями, будут более устойчивыми к конфликтам. Два элемента, имеющие одинаковый хэш для разных алгоритмов хеширования, были бы очень маловероятными.

Я надеялся сохранить 32-битное значение хеш-функции из соображений экономии места, поэтому я подумал, что могу переключиться на использование двух 16-битных алгоритмов вместо одного 32-битного алгоритма. Но это не увеличило бы диапазон возможных значений хэша ...

Я знаю, что переключение на два 32-битных хеша будет более устойчивым к столкновениям, но мне интересно, дает ли переключение на 2 16-битных хеша хоть какой-то выигрыш. над одним 32-битным хешем? Я не самый математически склонный человек, поэтому я даже не знаю, как начать проверку ответа, кроме как попытаться заставить его ...

Некоторые сведения о системе:

Элементы дают имена людям, они не являются случайными строками и обычно состоят из слов, букв и чисел без пробелов. Это вложенная хэш-структура, поэтому, если у вас есть что-то вроде {a => {b => {c => 'blah'}}}, вы получите значение 'blah', получив значение a / b / c, скомпилированный запрос будет состоять из 3 хеш-значений в непосредственной последовательности, хеш-значений a, b и затем c.

Проблема возникает только тогда, когда есть конфликт на заданном уровне. Коллизия между элементом верхнего и нижнего уровней - это нормально. У вас может быть {a => {a => {...}}}, что почти гарантирует коллизии на разных уровнях (не проблема).

На практике любой заданный уровень, скорее всего, будет иметь менее 100 значений для хеширования , и ни один из них не будет дублироваться на том же уровне.

Чтобы проверить алгоритм хеширования, который я принял (забыл, какой из них, но я не изобретал его), я загрузил весь список модулей CPAN Perl, разделив все пространства имен / модули на уникальные слов, и, наконец, хеширование каждого, ищущего коллизии, я обнаружил 0 коллизий. Это означает, что алгоритм имеет разное хеш-значение для каждого уникального слова в списке пространств имен CPAN (или что я сделал это неправильно). Мне это кажется достаточно хорошим, но это все еще не дает мне покоя.

7
задан Exodist 6 April 2011 в 04:58
поделиться