HashingFunction与Arrays.hashCode兼容

时间:2014-04-25 16:14:18

标签: java bytearray guava hashcode

我正在迁移一大堆代码以停止传递byte [],InputStreams和InputSuppliers,并且只使用ByteSource。

代码当前通过在原始byte []上使用Arrays.hashCode计算数据和ETag,并使用ByteSource转换为:

Arrays.hashCode(dataSource.read());

这个问题是ByteArrayInputSource上的dataSource.read()克隆了底层字节[],这比当前那里更糟糕。

我想使用dataSource.hash(HashFunction),但我想确保我不会破坏通过hashCode生成的ETag,因为这会导致一系列缓存失效。

任何人都知道HashFunction为我做这个工作吗?

1 个答案:

答案 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中的一些抽象类复制到您自己的包中。