arrays - 偏移独立散列函数

标签 arrays algorithm hash

是否有任何哈希函数可以为具有相同元素、相同相对位置但移动了 k 次的向量生成相同的桶?

例如:

hash([1,9,8,7]) -> b1
hash([9,8,7,1]) -> b1

hash([1,8,9,7]) -> b2
hash([1,9,8,5]) -> b3

v1 = [1,9,8,7] v2 = [9,8,7,1] 自 以来,两个向量应该得到相同的哈希值v2v1 左移 k=3 次。

但是 v3 = [1,8,9,7] 没有保持相同的相对顺序,而 v4 = [1,9,8,5] 有不同的值,所以他们都没有得到哈希值 b1。

我最初的方法是计算每个向量的最大值,并将其位置作为引用(偏移量 = 0)。这样一来,我只需要移动每个向量,使最大值始终位于第一个位置。这样移动的向量看起来是一样的。但是,向量可以有重复的元素,因此最大值有不同的位置。

最佳答案

  1. 找到字典序最小的数组旋转。

    native 方法是在 O(n2) 中检查所有旋转,但可以使用 Booth 算法、Shiloach 快速规范化算法或 Duval 林登分解算法在线性时间内完成。

    参见 this了解更多。

  2. 计算旋转数组的哈希值。

    这可以通过多种方式完成。例如,Java 会按如下方式执行:

    hash = s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
    

具有不同元素的数组将散列为相同的值并非不可能(这在散列中是不可避免的),但同一数组的所有旋转将具有相同的散列。

关于arrays - 偏移独立散列函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18330401/

相关文章:

perl - 如何使用一列索引值在单独的数据集中创建新列

c - 如何在C中对数组中的字符串进行排序?

java - 代码复杂度

algorithm - 如何确定 Delaunay 三角形是内部三角形还是外部三角形?

.net - 为什么 HashBytes 和 MD5CryptoServiceProvider().ComputeHash 不匹配?

php - 在PHP中使用blowfish存储密码

java - 如何返回数组中的特定值?

arrays - 如何将新哈希附加到哈希数组?

jquery - Nodejs 如果值相同则创建新数组

java - 将数组送入线程