小编典典

列表中的哈希函数与其中的项目顺序无关

algorithm

我想拥有一个为一组整数分配值的字典。

例如keyis [1 2 3]并且value将具有一定的价值。

关键是,[3 2 1]在我的情况下,如果我采用哈希方法,则哈希必须相等。

该集合将有2到10个项目。

项目的总和通常是固定的,因此我们不能根据总和创建哈希码,这是第一个自然的想法。

这不是一项家庭作业,实际上在我的代码中遇到了这个问题。

这个集合基本上IEnumerable<int>在C#中,因此任何数据结构都可以存储它们。

任何帮助表示赞赏。性能在这里也很重要。

立即想到:我们可以总结一下,items^2并且已经获得了更好的哈希值,但是我仍然想听听一些想法。

编辑: 嗯, 非常抱歉 ,每个人都建议使用排序,但我没有想到我需要说实际上排序和哈希是我使用的当前解决方案,并且我正在考虑使用更快的替代方法。


阅读 279

收藏
2020-07-28

共1个答案

小编典典

基本上,这里的所有方法都是同一模板的实例。将x 1,…,x n映射到f(x 1)op…op f(x
n),其中op是对某个集合X的交换交换操作,f是从项到X的映射。已使用此模板好几次都被证明是好的。

  • 在[1,p-1]中选择一个随机的大质数p和一个随机残数b。令f(x)= b x mod p,令op为加法。我们本质上将集合解释为多项式,并使用Schwartz-Zippel引理来界定发生碰撞的概率(=非零多项式以b为根模p的概率)。

  • 令op为XOR,令f为随机选择的表。这是Zobrist哈希,它通过直接的线性代数参数将期望的碰撞次数降至最低。

模幂运算很慢,因此请不要使用它。对于Zobrist散列(具有300万个项目),表f可能不适合L2,尽管它确实设置了一个主内存访问的上限。

相反,我将Zobrist散列作为出发点,并寻找行为像随机函数的廉价函数f。这本质上是非加密伪随机生成器的工作描述–我将尝试通过用x播种快速PRG并生成一个值来计算f。

编辑:鉴于所有集合都具有相同的总和,请不要将f选择为1阶多项式(例如,线性同余生成器的阶跃函数)。

2020-07-28