所以这里是我的所有代码供参考。
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的多项式方法。
我想知道我能不能得到一些帮助?
提前谢谢你们。
答案 0 :(得分:2)
负值是整数溢出引起的。将最高有效位设置为1
的任何整数都将解释为为负数。
哈希代码并不特别表示任何内容:对于相等的值,它们所需的全部是相同的,并且尽量对于不相等的值尽可能不同。这就是处理哈希码时可以安全地忽略整数溢出的原因。
答案 1 :(得分:0)
散列是int
类型,可以取负值。负值不应该与您有关。
当java int
变得太大(超过20亿)时,它会回绕到负值。这就是这里发生的事情:33的乘法最终会导致这种情况变为负面。