我需要一个具有以下属性的 Java 中的专用散列函数 h(X,Y)。
- X 和 Y 是字符串。
- h(X,Y) = h(Y,X)。
- X 和 Y 是任意长度的字符串,h(X,Y) 的结果也没有长度限制。
- 如果 X 不等于 A 且 Y 不等于 B,则 h(X,Y) 和 h(Y,X) 不应与 h(A,B) = h(B,A) 发生冲突。
- h() 不需要是安全散列函数,除非必须满足上述要求。
- 相当高性能,但这是一个开放式标准。
在我看来,我认为要求 2 和 4 有点矛盾,但也许我担心太多了。
目前,我在 Java 中所做的事情如下:
public static BigInteger hashStringConcatenation(String str1, String str2) {
BigInteger bA = BigInteger.ZERO;
BigInteger bB = BigInteger.ZERO;
for(int i=0; i<str1.length(); i++) {
bA = bA.add(BigInteger.valueOf(127L).pow(i+1).multiply(BigInteger.valueOf(str1.codePointAt(i))));
}
for(int i=0; i<str2.length(); i++) {
bB = bB.add(BigInteger.valueOf(127L).pow(i+1).multiply(BigInteger.valueOf(str2.codePointAt(i))));
}
return bA.multiply(bB);
}
我认为这很可怕,但这就是为什么我正在寻找更好的解决方案。谢谢。
忘了提到在 OS X 10.7 上具有 8GB RAM 和 Java 1.6 的 2.53GHz 双核 Macbook Pro 上,两个 8 (ASCII) 字符串的哈希函数大约需要 270 微秒。我怀疑随着字符串大小的增加,或者如果使用 Unicode 字符,这会更高。