我正在迁移一大堆代码以停止传递byte [],InputStreams和InputSuppliers,并且只使用ByteSource。
代码当前通过在原始byte []上使用Arrays.hashCode计算数据和ETag,并使用ByteSource转换为:
Arrays.hashCode(dataSource.read());
这个问题是ByteArrayInputSource上的dataSource.read()
克隆了底层字节[],这比当前那里更糟糕。
我想使用dataSource.hash(HashFunction)
,但我想确保我不会破坏通过hashCode生成的ETag,因为这会导致一系列缓存失效。
任何人都知道HashFunction为我做这个工作吗?
答案 0 :(得分:0)
我不知道任何已经可用的HashFunction
可以做你想做的事情,但是自己写它应该很容易。类似的东西:
public final class ByteArrayHashFunction extends AbstractStreamingHashFunction {
@Override
public Hasher newHasher() {
return new ByteArrayHasher();
}
@Override
public int bits() {
return 32;
}
private static final class ByteArrayHasher extends AbstractByteHasher {
private int hash = 1;
@Override
protected void update(byte b) {
hash = 31 * hash + b;
}
@Override
public HashCode hash() {
return HashCode.fromInt(hash);
}
}
}
您需要将common.hash
中的一些抽象类复制到您自己的包中。