hashAllUnordered 静态方法
- @Since("2.14")
为对象集合创建组合散列码。
即使元素为 null
,也会按照独立的方式计算 objects
中元素的 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);
}