У меня есть 64-битная машина, и я хочу использовать 128-битный murmurhash3 из-за его скорости (MurmurHash3_x64_128
функция в https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp).
Но дело в том, что мои входные данные для этой хеш-функции не будут длиннее 30 байт, в этом случае for
цикл в этом MurmurHash3_x64_128
Функция будет повторяться только один раз, а затем будет выполнена хвостовая часть. В такой схеме кажется, что микширование не будет таким большим. Я прав? Если нет, не могли бы вы уточнить, почему? Если да, что бы вы посоветовали разумной минимальной длине ключа ввода до 128 бит murmurhash3, чтобы хеширование было хорошим?
Второе — это обрезание выходных битов. Насколько я понял из ответа https://stackoverflow.com/a/11488383/7056851, хотя это приводит к большей частоте столкновений из-за меньшего диапазона вывода, нарезка вывода будет по-прежнему давать хорошие значения хеш-функции, если исходная хеш-функция достаточно «случайна». Мой вопрос, если 128-битный murmurhash3 является хорошим кандидатом для усечения вывода. Причина, по которой я спрашиваю это, заключается в том, что я хочу использовать MurmurHash3_x64_128
для его быстродействия, но мне нужны только 32-битные хеш-значения, поэтому я планирую разделить 128-битные и 32-битные и получить 4 32-битных хеш-значения для данного ключа. Но я сомневаюсь, насколько хороши полученные значения хеш-функции.
Последний вопрос касается порядка байтов. Если вы посмотрите на комментарий в строке 52 в ссылке на исходный код, он говорит:
Блокировка чтения — если вашей платформе необходимо выполнить обмен с прямым порядком байтов или можно обрабатывать только выровненные операции чтения, выполните преобразование здесь
Почему платформа является прямым или прямым порядком? В конце концов, все биты умножаются на некоторые константы и поворачиваются, и XORed, и т. Д., И что мы хотим от хэш-функции, в основном, чтобы сопоставить ключи ввода с выходным диапазоном, с равномерным распределением. Как порядок байтов меняет картину? И даже если это изменит картину, что, если на входе будет массив char? Порядковый номер не должен иметь значения, по крайней мере, для таких ключей, как массив символов, не так ли?
Как видите, я не очень хорош в анализе хеш-функций. Любое четкое объяснение приветствуется.
Задача ещё не решена.
Других решений пока нет …