hashAllUnordered 静态方法

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

为对象集合创建组合散列码。

即使元素为 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);
}