用Java命令独立哈希

Mar*_*ber 3 java hash set unordered

我想用Java计算一组字符串的哈希值.是的我可以对字符串进行排序并使用计算MD5哈希迭代digest.update.但我宁愿省略排序并使用类似combineUnordered https://github.com/google/guava/wiki/HashingExplained的内容 有很多类似的问题要求相同的顺序,例如顺序独立的哈希算法, 但它们没有提供一个简单的例子,展示了如何在Java中计算迭代的顺序无关散列.

Mag*_*nus 5

只是异或每个散列和顺序不重要,加上散列大小将固定而不是随着集合的大小增长.

使用内置java字符串哈希码的Hashcode:

int hashcode = strings.stream()
        .mapToInt(Object::hashCode)
        .reduce(0, (left, right) -> left ^ right);
Run Code Online (Sandbox Code Playgroud)

使用番石榴和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;
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,这对于 *sets* 来说是正确的,但对于可以包含重复项的 *bags* 来说,“XOR”不适用,因为重复项会将其重置为 *零* @LukeJoshuaPark,因此必须使用一些“SUM”(包装)。 (3认同)