xxHash32 function
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;
}