哈希表的数字折叠算法

时间:2018-11-26 11:55:44

标签: c data-structures hashtable

我正在学习有关数据结构的书。
我正在阅读“哈希表”一章,在“数字折叠”部分中,它显示了哈希算法。

 QAndroidJniObject intent("android/content/Intent")

    QAndroidJniObject::callStaticObjectMethod("org/qtproject/example/WifiReceiver","onReceive","(Landroid/content/Context;Landroid/content/Intent;)V;",QtAndroid::androidContext().object(),intent.object());

用ASCII码(0-127)替换字符串中的每个元素,并分别添加这些值。

documentation for grails v3.2.9

但是有一个问题。如果哈希表的大小为12289,字符串的最大长度为10位数字,则哈希函数返回10X127 = 1270,它仅返回0到1270之间的地址,因此根本不使用1271到12288之间的地址。 。

散列表的大小12289是二进制的11000000000001。这是总共14位。另一方面,最大地址值1270为10011110110,因此仅使用11位。这一事实表明,从未使用过这三个位。因此,每次迭代Hash函数的循环时,我们都将hashValue向左移动3位,并添加下一个ASCII代码。从理论上讲,这将能够哈希所有地址。

我的问题是为什么我应该向左移动3位?有什么理由不应该将它移到右边吗?

1 个答案:

答案 0 :(得分:0)

  1. 我不确定您是复制代码还是只是对代码进行了涂鸦,但是目前您的代码不是哈希码,而只是最后一个ascii代码的传递函数。我猜您是要对值进行XOR?
  2. 目前尚不清楚您建议的功能是什么,因此应澄清一下,但是,如果您仅对基于​​文本的数据进行XOR,则说明您做的不是很好的哈希函数。假设您的数据竟然只有偶数位? ASCII还有其他退化。 我假设hashValue ^ =键[i]
  3. 您不应向右(或向左)移动,因为会丢失一些位。假设您对hashValue的右7位进行XOR运算并向右移动。您的哈希值仅包含刚添加的值的右4位!如果您向左移动,但保持不变会花费更长的时间。您正在哈希值的一端删除位。您应该检查一个好的哈希函数。 维基百科是您的朋友(https://en.wikipedia.org/wiki/Hash_function
  4. 就退化值而言,加法要好一些,但它仍会创建一个非统一的哈希值(在大多数数据下,中间值比结尾值要多)。