hashAllUnordered 静态方法

  1. @Since("2.14")
int hashAllUnordered(
  1. Iterable<Object?> objects
)

为对象集合创建一个组合哈希码。

计算 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);
}