【问题标题】:Extendible hashing - most significant bits可扩展散列 - 最高有效位
【发布时间】:2013-01-01 21:16:56
【问题描述】:

我想编写可扩展的散列。在wiki 上,我在 python 中找到了很好的实现。但是这段代码使用了最低有效位,所以当我有哈希 1101 时,d = 1 的值是 1d = 2 的值是 01。我想使用最高有效位。例如:哈希1101d = 1 值为1d = 2 值为11。有什么简单的方法可以做到这一点吗?我试过了,但我做不到。

你明白为什么它使用最低有效位吗?

或多或少。当我们使用数组时,它会变得高效。好的,所以对于哈希函数,我想使用 4 字节整数中的四个最小位,但从左到右。

h = hash(k) 
h = h & 0xf #use mask to get four least bits
p = self.pp[ h >> ( 4 - GD)]

它不起作用,我不知道为什么。

【问题讨论】:

  • 您说您已经尝试过 - 发布代码,以便我们查看您哪里出错了。
  • 你明白为什么它使用最低有效位吗?
  • 当你说你想要最高有效位时,你想将其限制为特定大小的整数,还是最高的非零位?例如,8 位数字的最高有效四位是 15(又名000011110000 还是1111?前者很容易计算,后者不太容易计算(可能需要log)。
  • “但从左到右”和“最少位”是什么意思? GD 是什么?为什么你关心使用一些四位而不是任何其他四位?如果你的哈希函数好的话,它实际上是一个随机数,无论你选择哪四位,它仍然是一个随机数。

标签: python algorithm hash


【解决方案1】:

使用最低有效位计算哈希是计算哈希的最快方法,因为它只需要 AND 位运算。这使它非常受欢迎。

这是一个使用最高有效位的哈希的实现(用 C 语言)。由于没有直接的方法可以知道最高有效位,因此它反复测试剩余值是否只有指定数量的位。

int significantHash(int value, int bits) {
    int mask = (1 << bits) - 1;
    while (value > mask) {
        value >>= 1;
    }
    return value;
}

我推荐使用数字的所有位的重叠哈希。从本质上讲,它减少了相同位数的部分数量并对它们进行异或。它比最不重要的散列运行得慢,但比重要的散列快。最重要的是,它提供了比其他两种方法更好的分散性,当必须散列的数字具有特定的位相关模式时,它成为更好的候选者。

int overlappingHash(int value, int bits) {
    int mask = (1 << bits) - 1;
    int answer = 0;
    do {
        answer ^= (value & mask);
        value >>= bits;
    } while (value > 0);
    return answer;
}

【讨论】:

    猜你喜欢
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    • 2014-11-23
    相关资源
    最近更新 更多