xxHash32 function

int xxHash32(
  1. Uint8List data, [
  2. int seed = 0
])

Computes xxHash32 of data with seed (both treated as unsigned 32-bit).

Reference vectors (seed 0): '' → 0x02CC5D05, 'abc' → 0x32D153FF, 'test' → 1042293711.

Implementation

int xxHash32(Uint8List data, [int seed = 0]) {
  final length = data.length;
  var index = 0;
  int hash;

  if (length >= 16) {
    var v1 = _u32(seed + _prime1 + _prime2);
    var v2 = _u32(seed + _prime2);
    var v3 = _u32(seed);
    var v4 = _u32(seed - _prime1);
    final limit = length - 16;
    while (index <= limit) {
      v1 = _round(v1, _lane32(data, index));
      v2 = _round(v2, _lane32(data, index + 4));
      v3 = _round(v3, _lane32(data, index + 8));
      v4 = _round(v4, _lane32(data, index + 12));
      index += 16;
    }
    hash = _u32(
      _rotl32(v1, 1) + _rotl32(v2, 7) + _rotl32(v3, 12) + _rotl32(v4, 18),
    );
  } else {
    hash = _u32(seed + _prime5);
  }

  hash = _u32(hash + length);

  while (index + 4 <= length) {
    hash = _mul32(
      _rotl32(_u32(hash + _mul32(_lane32(data, index), _prime3)), 17),
      _prime4,
    );
    index += 4;
  }
  while (index < length) {
    hash = _mul32(
      _rotl32(_u32(hash + _mul32(data[index], _prime5)), 11),
      _prime1,
    );
    index++;
  }

  hash = _u32(hash ^ (hash >>> 15));
  hash = _mul32(hash, _prime2);
  hash = _u32(hash ^ (hash >>> 13));
  hash = _mul32(hash, _prime3);
  hash = _u32(hash ^ (hash >>> 16));
  return hash;
}