Для ассоциативного массива я использую хэширование с 72 до 26 бит, и мне нужна чрезвычайно низкая частота конфликтов. Скорость также является важным фактором. Я начал с https://en.wikipedia.org/wiki/Hash_function#Hashing_By_Nonlinear_Table_Lookup Это достаточно быстро, но при тестировании я получил коллизии в пределах первых 100 входов!
for(=0; k<9; k++)
hash ^= randombits[byteptr[k]];
hash &= (1<<HASHBITS)-1
Проблема в том, что все мои входные данные являются производными друг от друга - есть начальные 72 бита, а последующие входные данные получены из предыдущего путем обмена 2-мя битовыми парами (выровненными по четным границам битов) друг с другом. Приведенный выше простой цикл XOR с треском провалился. Очевидным подходом было бы использование байтового индекса «k» для того, чтобы каким-либо образом изменять хеш на каждой итерации. В дополнение к предложениям по коду я ищу теоретическую основу - я хочу иметь хорошее представление о том, какой будет частота столкновений. Читая статьи, я ничего не нахожу относительно эффективности хеширования при перестановках. Я уверен, что с крипто-хэшами все будет хорошо, но они выглядят медленными. Предложения и указатели для моих исследований приветствуются, и спасибо. FWIW Я использую ARC4 для генерации "случайных битов", массива 256 u_int32_t.
ИЗМЕНИТЬ для ясности: битовые транспозиции на входе выглядят следующим образом: для четных N и X меньше 72 биты (N: N + 1) меняются местами на биты (X: X + 1) для случайных X и N. Все такие свопы фактически меняют состояние - идентичные биты никогда не меняются местами.