我想用Java计算一组字符串的哈希值。是的,我可以对字符串进行排序并计算
MD5哈希迭代使用digest.update
。
但我宁愿省略排序并使用类似的东西combineUnordered
https://github.com/google/guava/wiki/HashingExplained https://github.com/google/guava/wiki/HashingExplained有很多类似的问题提出相同的问题,例如与顺序无关的哈希算法 https://stackoverflow.com/questions/30734848/order-independant-hash-algorithm但他们都没有提供一个简单的示例来展示如何在 Java 中迭代计算顺序无关的哈希值。
只需对每个散列进行异或,顺序就无关紧要,而且散列大小将是固定的,而不是随着集合的大小而增长。
使用内置 java 字符串哈希码的哈希码:
int hashcode = strings.stream()
.mapToInt(Object::hashCode)
.reduce(0, (left, right) -> left ^ right);
使用番石榴和 MD5 的哈希码就像所问的问题一样:
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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)