Существуют ли какие-либо известные хэш-алгоритмы, которые вводят вектор int и выводят один int, который работает аналогично скалярному произведению?
Другими словами, я думаю о хэш-алгоритме, который может выглядеть так в С++:
// 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;
}
Я заинтересован в этом, потому что я пишу статью об алгоритме, который выиграл бы от любой предыдущей работы над подобными хэшами. В частности, было бы здорово, если бы что-либо было известно о свойствах столкновения хэш-алгоритма, подобного этому.
Алгоритм, который меня интересует, имеет целые векторы хеша, но что-то для float-векторов также было бы круто.
Разъяснение
Хэш предназначен для использования в хеш-таблице для быстрого поиска ключей/значений. Здесь нет проблем с безопасностью.
Желаемый ответ - это что-то вроде набора констант, которые, по-видимому, особенно хорошо работают для хэша, подобного этому, - аналогичны мультипликатору и модулю, который работает лучше других, чем генератор псевдослучайных чисел.
Например, некоторые варианты констант для линейного конгруэнтного псевдослучайного генератора, как известно, дают оптимальные длины циклов и имеют легко вычисляемые модули. Возможно, кто-то сделал исследование, чтобы показать, что определенный набор мультипликативных констант вместе с константой по модулю в векторном хеше может уменьшить вероятность столкновений между соседними целыми векторами.