【问题标题】:Hash coding in Java negative numbersJava负数中的哈希编码
【发布时间】:2014-03-15 20:51:06
【问题描述】:

所以这段代码产生哈希码:

int x = 33;
int hash = 7;
for (String str: list) {

    for (int o = 0; o < str.length(); o++) {
        hash = ((33*hash) + str.charAt(o));
    }

但是其中一些是负面的。要求在过载期间处理它们,以便可以将它们放入哈希表中,因为我必须对它们进行查找。不要去问要不要处理,要处理,不能是负数。

我必须通过这个方法来做:

((ak + b) mod p) mod T; where p is prime.

有人有什么想法吗?

【问题讨论】:

  • 获取结果的绝对值。
  • @Sotirios Delimanolis 你是什么意思?怎么样?
  • 你是什么意思如何?如何获得绝对值?我会让你弄清楚。
  • 你应该可以在BigInteger使用;或者,如果您关心性能并且您处理大量数字,请查看apfloat
  • “超载期间”是什么意思?

标签: java hash hashtable hashcode negative-number


【解决方案1】:

如果您不希望它们为负数,只需添加

hash = Math.abs(hash)

这将给出一个非负数。 但请注意,你会失去一点;)

【讨论】:

  • 现在看起来更复杂了,为什么呢?如果是数学的话,另一个问题:为什么是 33?
  • 33 是素数,是霍纳多项式法的设定值。之所以这样,是因为我们被这样告知了哈哈
  • 33 = 3 * 11 无论如何,我的建议是:尽可能使用最好的哈希值(还有其他的),如果你不希望它们为负数,则将它们设为非负数。失去一点分辨率 - 一半的空间。
猜你喜欢
  • 1970-01-01
  • 2012-09-16
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 2012-08-13
  • 2018-03-13
  • 1970-01-01
  • 2021-05-26
相关资源
最近更新 更多