Java负值哈希码

时间:2014-03-14 14:48:08

标签: java hashcode polynomial-math negative-number

所以这里是我的所有代码供参考。

import java.io.*;
import java.util.*;

public class Plagiarism {

    public static void main(String[] args) throws Exception {
        //you are not using 'myPlag' anywhere, you can safely remove it
//      Plagiarism myPlag = new Plagiarism();

        if (args.length == 0) {
            System.out.println("Error: No files input");
            System.exit(0);
        }

        String foo = null;
        for (int i = 0; i < 2; i++) {
            BufferedReader reader = new BufferedReader(new FileReader(args[i]));
            foo = simplify(reader);
            // System.out.print(foo);
            int blockSize = Integer.valueOf(args[2]);

            List<String> list = new ArrayList<String>();
            for (int k = 0; k < foo.length() - blockSize + 1; k++) {
                list.add(foo.substring(k, k + blockSize));

                int x = 33;
                int hash = 0;
                for (String str: list) {
                    for (int o = 0; o < str.length(); o++) {
                        hash = 33*hash + str.charAt(o);
                    }
                }
                System.out.println(hash);

                /* List<Integer> newList = new ArrayList<Integer>(list.size());
                for (String myInt : list) {
                    newList.add(Integer.parseInt(myInt));

                    int x = 33;
                    int hash = 0;
                    for (int o = 0; o < newList.size(); o++) {
                        hash = x*hash + newList.get(o);
                    }
                } */


            }
            // System.out.print(list);
        }




    }

    public static String simplify(BufferedReader input)
            throws IOException {

        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = input.readLine()) != null) {
            sb.append(line.replaceAll("[^a-zA-Z]", "").toLowerCase());
        }
        return sb.toString();
    }
}

虽然我想特别关注这一部分:

int x = 33;
                    int hash = 0;
                    for (String str: list) {
                        for (int o = 0; o < str.length(); o++) {
                            hash = 33*hash + str.charAt(o);
                        }
                    }
                    System.out.println(hash);

返回的一些值是负哈希值。为什么是这样?即使块大小很小(即2),它仍然在做。我知道这与&#34; modulo p&#34;也许?我在这里使用Horner的多项式方法。

我想知道我能不能得到一些帮助?

提前谢谢你们。

2 个答案:

答案 0 :(得分:2)

负值是整数溢出引起的。将最高有效位设置为1的任何整数都将解释为为负数。

哈希代码并不特别表示任何内容:对于相等的值,它们所需的全部是相同的,并且尽量对于不相等的值尽可能不同。这就是处理哈希码时可以安全地忽略整数溢出的原因。

答案 1 :(得分:0)

散列是int类型,可以取负值。负值不应该与您有关。

当java int变得太大(超过20亿)时,它会回绕到负值。这就是这里发生的事情:33的乘法最终会导致这种情况变为负面。