我想为字符串生成键值。此密钥将用于哈希函数。在这种情况下,我在生成密钥时使用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;
}
有人能帮助我吗? 谢谢!
答案 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
。