Algorithm 散列数值向量的方法?

Algorithm 散列数值向量的方法?,algorithm,math,hash,vector,Algorithm,Math,Hash,Vector,是否有任何已知的哈希算法可以输入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, 7

是否有任何已知的哈希算法可以输入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;
}
//为了简单起见,我不担心溢出,而是假设| v |<7。
int HashVector(常量向量&v){
常数int N=kSomethingBig;
const int w[]={23473934,23828194};//仔细选择的常数。
int结果=0;
对于(inti=0;i
我对此很感兴趣,因为我正在写一篇关于算法的论文,该算法将受益于以前关于类似哈希的任何工作。特别是,如果知道像这样的散列算法的冲突属性,那就太好了

我感兴趣的算法是散列整数向量,但浮点向量的算法也很酷

澄清

该哈希用于哈希表中的快速键/值查找。这里没有安全问题

理想的答案类似于一组常数,可以证明它们对于这样的散列特别有效——类似于乘法器和模,作为伪随机数生成器,它的效果比其他方法更好


例如,已知线性同余伪随机发生器的某些常数选择可给出最佳循环长度,并且具有易于计算的模。也许有人做过研究,表明向量散列中的一组乘法常数以及一个模常数可以减少附近整数向量之间发生冲突的机会。

根据常数的大小,我不得不说输入向量中的混沌程度会对结果产生影响。然而,对你的帖子进行快速定性分析,会发现你有一个良好的开端:

  • 您的输入是相乘的,因此增加了每次迭代中相似输入值之间的分离度(例如,65+66比65*66小得多),这很好
  • 它是确定性的,除非你的向量应该被视为一个集合而不是一个序列。为了清楚起见,v={23,30,37}应该与v={30,23,37}不同吗
  • 分布的均匀性将根据v中输入值的范围和混沌而变化。然而,广义整数散列算法也是如此

出于好奇,为什么不使用现有的整数哈希算法并对结果执行一些有趣的数学运算?

虽然我可能完全误解了你的意思,但将向量视为字节流并对其进行一些已知的哈希运算(即or)可能是个好主意


只是想澄清一下,这些散列已知具有良好的散列特性,我相信没有理由重新发明自行车并实现新的散列。另一种可能是使用已知的CRC angorithm。

Python用于以这种方式散列元组():

在您的情况下,
将始终是一个整数,它使用以下算法:

class int:
    def __hash__(self):
        value = self
        if value == -1:
            value == -2
        return value
这与内部产品无关,不过。。。因此,这可能没什么帮助。

我做了一些(未发表的,实用的)实验,测试了各种字符串哈希算法。(事实证明,Java默认的字符串哈希函数很糟糕。)

简单的实验是对英语词典进行散列,比较算法A和算法B的冲突数量

您可以构建一个类似的实验:随机生成$BIG_数量的长度为7或更少的可能向量。在算法A上散列,在算法B上散列,然后比较冲突的数量和严重程度


在你能够做到这一点之后,你可以使用模拟退火或类似的技术来寻找对你来说表现良好的“幻数”。在我的工作中,对于给定的感兴趣词汇和严格限制的散列大小,我们能够通过改变“幻数”使通用算法在几种人类语言中运行良好。

关于输入值的分布,您知道或假设了什么?你的例子看起来都小于1000。因为目标是为一篇论文找到参考文献,所以他们所做的任何假设都可能是正确的。顺便说一句,示例中的组合常量不是作为输入,而是作为算法中的常量。在该示例中,我没有指定任何实际输入值。您是否考虑过使用以下一个或多个通用哈希函数:它们非常快速高效。谢谢,但是SHA1和MD5是为安全而设计的,而不是为了避免冲突而设计的。它们的工作原理也与内积非常不同。我正在写一篇关于算法的论文,我很想找到关于这个主题的参考文献,所以我不能不说“STL使用了这个实现,所以它一定很好”。好主意,Patrick。这听起来像是找到实际算法的一种非常实用和有效的方法。我仍然对以前发表的关于这个问题的任何著作感到好奇。
class int:
    def __hash__(self):
        value = self
        if value == -1:
            value == -2
        return value