我想用Java计算一组字符串的哈希值.是的我可以对字符串进行排序并计算出来
使用digest.update进行MD5哈希迭代.
但我宁愿省略排序并使用combineUnordered https://github.com/google/guava/wiki/HashingExplained之类的东西
有许多类似的问题要求相同,如Order-independant Hash Algorithm
但是没有它们提供了一个简单的例子,展示了如何在Java中计算迭代的顺序无关哈希.
解决方法:
只是异或每个散列和顺序不重要,加上散列大小将固定而不是随着集合的大小增长.
使用内置java字符串哈希码的Hashcode:
int hashcode = strings.stream()
.mapToInt(Object::hashCode)
.reduce(0, (left, right) -> left ^ right);
使用番石榴和MD5的Hashcode问题如下:
Optional<byte[]> hash = strings.stream()
.map(s -> Hashing.md5().hashString(s, Charset.defaultCharset()))
.map(HashCode::asBytes)
.reduce((left, right) -> xor(left, right));
static byte[] xor(byte[] left, byte[] right) {
if(left.length != right.length) {
throw new IllegalArgumentException();
}
byte[] result = new byte[left.length];
for(int i=0; i < result.length; i++) {
result[i] = (byte) (left[i] ^ right[i]);
}
return result;
}