Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 哈希函数的密钥生成返回较大字符串的minas值_Java_Hashmap - Fatal编程技术网

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

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

我想为字符串生成键值。这个键将被用在一个散列函数中。在本例中,我使用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;

}
公共静态长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