Java 哈希函数的密钥生成返回较大字符串的minas值
我想为字符串生成键值。这个键将被用在一个散列函数中。在本例中,我使用ASCII字符值生成密钥。我的方法适用于较短的单词。但问题是,当我为一个大约20个字符的单词生成一个键时,它会返回一个负值。我怎样才能解决这个问题。我的代码段如下Java 哈希函数的密钥生成返回较大字符串的minas值,java,hashmap,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
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;
}
公共静态长genKey(字符串s){
长键=0;
对于(int i=0;i
有人能帮我吗。
谢谢大家! 如果你改变
key += ch * factor;
到
然后您将只向
键
添加正值,因此键
将以正值结束。这是否满足您的需要?负值一定是坏事吗?请注意,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
如果您坚持要为
因子
设置一个正值,那么在将其添加到键
之前,可以调用Math.abs(factor)
以获取绝对值,或者使用按位和屏蔽符号位:因子&0x7fffff
,为什么不直接使用s.hashCode()
?这是您不需要的吗?s.hashCode()
返回一个int
,并且通常是负数。看起来OP想要一个long
。我想要自己实现哈希映射。加法仍然可以有整数溢出,还有Math.abs(long.MIN_VALUE)<0,所以有时候它仍然会有一个奇怪的边缘情况。我考虑过这一点。但是,将一个字符大小的数字反复乘以25,就无法得到MIN\u值。所以根本就没有奇怪的边缘问题。它起作用了。我只想用它来表示长度约为20个字符的字符串。即使是30个字符的长度,这也能正常工作。非常感谢。在加法步骤中仍然可以有整数溢出,而且ch*一个大的正数仍然可以是负数,因此有很多溢出边cases@MWB加法中不能有整数溢出。您正在将int
值添加到long
中。您需要有一个超过40亿个字符的字符串,才能成为问题。
scala> 25 * 25 * 25 * 25 * 25 * 25 * 25
res0: Int = 1808548329
scala> 25 * 25 * 25 * 25 * 25 * 25 * 25 * 25
res1: Int = -2030932031