【发布时间】:2018-10-08 13:34:00
【问题描述】:
我想在 Java 中散列大量 int[]。我的数组包含从根到树中节点的路径(节点已编号),因此它们在第一个值上非常相似(因为所有路径都来自根)。
我正在使用Google Guava Hasher,我将数组的每个值添加到哈希器以获取 hashCode:
HashFunction hashFunction = Hashing.murmur3_128();
Hasher hasher = hashFunction.newHasher();
for (int i: myArray) {
hasher.putInt(i);
}
int hashCode = inthasher.hash().asInt();
我想避免为每个路径再次散列整个数组,并且只通过将最后一个值添加到我的散列器副本来散列最后一个值。像这样:
anotherHasher = hasher.clone();
anotherHasher.putInt(someInt);
int hashCode = hasher.hash().asInt();
int anotherHashCode = anotherHasher.hash().asInt();
但是Hasher不存在克隆方法。
这种复制会节省计算时间吗?是否可以使用包含Hasher 的包装器来实现Cloneable,即使后者不可克隆?如果是怎么办?还有其他方法吗?
编辑: 根据记录,使用 Guava 进行散列需要花费时间的不是使用 hasher.putInt(someInt) 添加元素,而是在末尾使用 hasher.hash() 调用散列本身。因此,即使深度复制也很快(不是,请参阅 Tomasz Linkowski 的回答),我的方法不相关,不值得进一步研究。
【问题讨论】:
-
我认为不支持clone方法,因为很难确定Array是否被修改..或者实际上它的状态不是恒定的。
-
为什么知道数组是否被修改很重要?如果我克隆了 Hasher,我希望它独立于前一个,那么我为什么要关心它是否被修改(或它源自的 Array)?
-
或者您的意思是在复制期间对哈希器进行某种锁定很难实现?
-
最好的方法是覆盖 .deepClone() 并在克隆时设置自己的参数,因为类会更深入。