是否有任何已知的散列算法输入int的向量并输出一个类似于内积的单个int?散列数值向量的方法?
换句话说,我想一个散列算法可能看起来像在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;
}
我很感兴趣,这是因为我在一个算法,将有利于撰写的论文从任何以前的工作类似的哈希。特别是,如果有关于像这样的散列算法的碰撞属性的任何知识,这将是非常好的。
我感兴趣的算法会散列整数向量,但浮点向量的东西也会很酷。
澄清
散列旨在用于在哈希表中使用快速键/值查找。这里没有安全问题。
想要的答案就像一组常数,可证明这样的散列效果特别好 - 类似于乘法器和模数,其作用比其他伪随机数生成器更好。已知例如,线性同余伪随机发生器的一些常数选择给出最佳周期长度并且具有易于计算的模数。也许有人已经做了研究,表明在矢量哈希中的一组乘法常数以及模常数可以减少在附近的整数向量中碰撞的机会。
您对输入值的分布有何认识或假设?你的例子看起来好像都小于1000. – 2008-11-12 06:47:21
既然目标是找到一篇论文的参考文献,他们所做的任何假设都可能是正确的。 顺便说一下,这个例子中的组合常数并不是输入,而是算法中的常量。在这个例子中,我没有指定任何实际的输入值。 – Tyler 2008-11-12 08:10:09
您是否考虑过使用以下一种或多种通用哈希函数:http://www.partow.net/programming/hashfunctions/index.html它们非常快速且高效。 – 2011-01-23 10:12:50