Существуют ли какие-либо известные алгоритмы хеширования, которые вводят вектор целых и выдают одно целое, которое работает аналогично внутреннему произведению?
Другими словами, я думаю об алгоритме хеширования, который может выглядеть следующим образом в C ++:
// For simplicity, I'm not worrying about overflow, and assuming |v| < 7.
int HashVector(const vector<int>& v) {
const int N = kSomethingBig;
const int w[] = {234, 739, 934, 23, 828, 194}; // Carefully chosen constants.
int result = 0;
for (int i = 0; i < v.size(); ++i) result = (result + w[i] * v[i]) % N;
return result;
}
Мне это интересно, потому что я пишу статью об алгоритме, который выиграл бы от любой предыдущей работы над подобными хэшами. В частности, было бы здорово, если бы что-нибудь было известно о свойствах столкновения алгоритма хеширования, подобного этому.
Алгоритм, который меня интересует, хеширует целочисленные векторы, но кое-что для векторов с плавающей запятой также будет классным.
Разъяснение
Хеш предназначен для использования в хеш-таблице для быстрого поиска по ключу / значению. Здесь нет проблем с безопасностью.
Требуемый ответ - это что-то вроде набора констант, которые доказуемо работают особенно хорошо для такого хэша - аналогично множителю и модулю, который лучше других работает как генератор псевдослучайных чисел.
Например, известно, что некоторые варианты выбора констант для линейного конгруэнтного псевдослучайного генератора дают оптимальные длины циклов и имеют простые для вычисления модули. Возможно, кто-то провел исследование, чтобы показать, что определенный набор мультипликативных констант, наряду с постоянной по модулю, в векторном хеше может уменьшить вероятность столкновений между соседними целочисленными векторами.