hashAllUnordered 静态方法
- @Since("2.14")
为对象集合创建一个组合哈希码。
计算 objects
中元素的哈希码,即使它们是 null
,也是通过以数值方式独立组合每个元素的 Object.hashCode 来实现的。
hashAllUnordered({o})
的结果不等于 o.hashCode
。
示例
bool setEquals<T>(Set<T> set1, Set<T> set2) {
var hashCode1 = Object.hashAllUnordered(set1);
var hashCode2 = Object.hashAllUnordered(set2);
if (hashCode1 != hashCode2) return false;
// Compare elements ...
}
当函数再次以具有相同哈希码的对象调用时,即使对象不一定按相同顺序排列,计算值也将保持一致,
此函数生成的哈希值 不保证 在同一程序的多次运行中保持稳定。确切算法可能在不同平台或平台库的不同版本之间有所不同,也可能取决于每次程序执行时都会变化的值。
实现
@Since("2.14")
static int hashAllUnordered(Iterable<Object?> objects) {
int sum = 0;
int count = 0;
const int mask = 0x3FFFFFFF;
for (var object in objects) {
int objectHash = SystemHash.smear(object.hashCode);
sum = (sum + objectHash) & mask;
count += 1;
}
return SystemHash.hash2(sum, count, 0);
}