Hash函数的密钥生成返回较大字符串的minas值

时间:2013-11-19 00:06:42

标签: java hashmap

我想为字符串生成键值。此密钥将用于哈希函数。在这种情况下,我在生成密钥时使用ASCII字符值。我的方法适用于较短的单词。但问题是,当我生成一个关于20个字符的单词的键时,它返回一个负值。我怎样才能解决这个问题。我的代码段如下。

    public static long genKey(String s) {
    long key = 0;
    for (int i = 0; i < s.length(); i++) {
        char ch = s.charAt(i);

        if (i == 0) {

            key += ch;

        } else {

            int factor = 1;
            for (int j = 0; j < i; j++) {
                factor = factor * 25;

            }
            key += ch * factor;

        }

    }
    return key;

}

有人能帮助我吗? 谢谢!

2 个答案:

答案 0 :(得分:0)

如果你改变了

 key += ch * factor;

 key += Math.abs(ch * factor);

然后您只会向key添加正值,因此key最终会为正值。这符合您的需求吗?

答案 1 :(得分:0)

负值是否一定是坏事?请注意factor将在8个字符内溢出带符号的32位int类型 - 如果该值对于31位而言太大而且设置了第32位,则此溢出将导致“负”值:

scala> 25 * 25 * 25 * 25 * 25 * 25 * 25
res0: Int = 1808548329

scala> 25 * 25 * 25 * 25 * 25 * 25 * 25 * 25
res1: Int = -2030932031

如果您坚持为factor设置正值,则在将其添加到key之前,请先调用Math.abs(factor)以获取绝对值,或使用按位AND来屏蔽离开标志位:factor & 0x7FFFFFFF