private static long hashLength17to32(byte[] bytes, int offset, int length) { long mul = K2 + length * 2; long a = load64(bytes, offset) * K1; long b = load64(bytes, offset + 8); long c = load64(bytes, offset + length - 8) * mul; long d = load64(bytes, offset + length - 16) * K2; return hashLength16( rotateRight(a + b, 43) + rotateRight(c, 30) + d, a + rotateRight(b + K2, 18) + c, mul); }
private static long hashLength33To64(byte[] bytes, int offset, int length) { long mul = K2 + length * 2; long a = load64(bytes, offset) * K2; long b = load64(bytes, offset + 8); long c = load64(bytes, offset + length - 8) * mul; long d = load64(bytes, offset + length - 16) * K2; long y = rotateRight(a + b, 43) + rotateRight(c, 30) + d; long z = hashLength16(y, a + rotateRight(b + K2, 18) + c, mul); long e = load64(bytes, offset + 16) * mul; long f = load64(bytes, offset + 24); long g = (y + load64(bytes, offset + length - 32)) * mul; long h = (z + load64(bytes, offset + length - 24)) * mul; return hashLength16( rotateRight(e + f, 43) + rotateRight(g, 30) + h, e + rotateRight(f + a, 18) + g, mul); }
private static long hashLength17to32(byte[] bytes, int offset, int length) { long mul = K2 + length * 2; long a = load64(bytes, offset) * K1; long b = load64(bytes, offset + 8); long c = load64(bytes, offset + length - 8) * mul; long d = load64(bytes, offset + length - 16) * K2; return hashLength16( rotateRight(a + b, 43) + rotateRight(c, 30) + d, a + rotateRight(b + K2, 18) + c, mul); }
/** * Computes intermediate hash of 32 bytes of byte array from the given offset. Results are * returned in the output array because when we last measured, this was 12% faster than allocating * new arrays every time. */ private static void weakHashLength32WithSeeds( byte[] bytes, int offset, long seedA, long seedB, long[] output) { long part1 = load64(bytes, offset); long part2 = load64(bytes, offset + 8); long part3 = load64(bytes, offset + 16); long part4 = load64(bytes, offset + 24); seedA += part1; seedB = rotateRight(seedB + seedA + part4, 21); long c = seedA; seedA += part2; seedA += part3; seedB += rotateRight(seedA, 44); output[0] = seedA + part4; output[1] = seedB + c; }
private static long hashLength17to32(byte[] bytes, int offset, int length) { long mul = K2 + length * 2; long a = load64(bytes, offset) * K1; long b = load64(bytes, offset + 8); long c = load64(bytes, offset + length - 8) * mul; long d = load64(bytes, offset + length - 16) * K2; return hashLength16( rotateRight(a + b, 43) + rotateRight(c, 30) + d, a + rotateRight(b + K2, 18) + c, mul); }
private static long hashLength33To64(byte[] bytes, int offset, int length) { long mul = K2 + length * 2; long a = load64(bytes, offset) * K2; long b = load64(bytes, offset + 8); long c = load64(bytes, offset + length - 8) * mul; long d = load64(bytes, offset + length - 16) * K2; long y = rotateRight(a + b, 43) + rotateRight(c, 30) + d; long z = hashLength16(y, a + rotateRight(b + K2, 18) + c, mul); long e = load64(bytes, offset + 16) * mul; long f = load64(bytes, offset + 24); long g = (y + load64(bytes, offset + length - 32)) * mul; long h = (z + load64(bytes, offset + length - 24)) * mul; return hashLength16( rotateRight(e + f, 43) + rotateRight(g, 30) + h, e + rotateRight(f + a, 18) + g, mul); }
private static long hashLength33To64(byte[] bytes, int offset, int length) { long mul = K2 + length * 2; long a = load64(bytes, offset) * K2; long b = load64(bytes, offset + 8); long c = load64(bytes, offset + length - 8) * mul; long d = load64(bytes, offset + length - 16) * K2; long y = rotateRight(a + b, 43) + rotateRight(c, 30) + d; long z = hashLength16(y, a + rotateRight(b + K2, 18) + c, mul); long e = load64(bytes, offset + 16) * mul; long f = load64(bytes, offset + 24); long g = (y + load64(bytes, offset + length - 32)) * mul; long h = (z + load64(bytes, offset + length - 24)) * mul; return hashLength16( rotateRight(e + f, 43) + rotateRight(g, 30) + h, e + rotateRight(f + a, 18) + g, mul); }
private static long hashLength17to32(byte[] bytes, int offset, int length) { long mul = K2 + length * 2; long a = load64(bytes, offset) * K1; long b = load64(bytes, offset + 8); long c = load64(bytes, offset + length - 8) * mul; long d = load64(bytes, offset + length - 16) * K2; return hashLength16( rotateRight(a + b, 43) + rotateRight(c, 30) + d, a + rotateRight(b + K2, 18) + c, mul); }
private static long hashLength33To64(byte[] bytes, int offset, int length) { long mul = K2 + length * 2; long a = load64(bytes, offset) * K2; long b = load64(bytes, offset + 8); long c = load64(bytes, offset + length - 8) * mul; long d = load64(bytes, offset + length - 16) * K2; long y = rotateRight(a + b, 43) + rotateRight(c, 30) + d; long z = hashLength16(y, a + rotateRight(b + K2, 18) + c, mul); long e = load64(bytes, offset + 16) * mul; long f = load64(bytes, offset + 24); long g = (y + load64(bytes, offset + length - 32)) * mul; long h = (z + load64(bytes, offset + length - 24)) * mul; return hashLength16( rotateRight(e + f, 43) + rotateRight(g, 30) + h, e + rotateRight(f + a, 18) + g, mul); }
/** * Computes intermediate hash of 32 bytes of byte array from the given offset. Results are * returned in the output array because when we last measured, this was 12% faster than allocating * new arrays every time. */ private static void weakHashLength32WithSeeds( byte[] bytes, int offset, long seedA, long seedB, long[] output) { long part1 = load64(bytes, offset); long part2 = load64(bytes, offset + 8); long part3 = load64(bytes, offset + 16); long part4 = load64(bytes, offset + 24); seedA += part1; seedB = rotateRight(seedB + seedA + part4, 21); long c = seedA; seedA += part2; seedA += part3; seedB += rotateRight(seedA, 44); output[0] = seedA + part4; output[1] = seedB + c; }
/** * Computes intermediate hash of 32 bytes of byte array from the given offset. Results are * returned in the output array because when we last measured, this was 12% faster than allocating * new arrays every time. */ private static void weakHashLength32WithSeeds( byte[] bytes, int offset, long seedA, long seedB, long[] output) { long part1 = load64(bytes, offset); long part2 = load64(bytes, offset + 8); long part3 = load64(bytes, offset + 16); long part4 = load64(bytes, offset + 24); seedA += part1; seedB = rotateRight(seedB + seedA + part4, 21); long c = seedA; seedA += part2; seedA += part3; seedB += rotateRight(seedA, 44); output[0] = seedA + part4; output[1] = seedB + c; }
private static long hashLength0to16(byte[] bytes, int offset, int length) { if (length >= 8) { long mul = K2 + length * 2; long a = load64(bytes, offset) + K2; long b = load64(bytes, offset + length - 8); long c = rotateRight(b, 37) * mul + a; long d = (rotateRight(a, 25) + b) * mul; return hashLength16(c, d, mul); } if (length >= 4) { long mul = K2 + length * 2; long a = load32(bytes, offset) & 0xFFFFFFFFL; return hashLength16(length + (a << 3), load32(bytes, offset + length - 4) & 0xFFFFFFFFL, mul); } if (length > 0) { byte a = bytes[offset]; byte b = bytes[offset + (length >> 1)]; byte c = bytes[offset + (length - 1)]; int y = (a & 0xFF) + ((b & 0xFF) << 8); int z = length + ((c & 0xFF) << 2); return shiftMix(y * K2 ^ z * K0) * K2; } return K2; }
/** * Computes intermediate hash of 32 bytes of byte array from the given offset. Results are * returned in the output array because when we last measured, this was 12% faster than allocating * new arrays every time. */ private static void weakHashLength32WithSeeds( byte[] bytes, int offset, long seedA, long seedB, long[] output) { long part1 = load64(bytes, offset); long part2 = load64(bytes, offset + 8); long part3 = load64(bytes, offset + 16); long part4 = load64(bytes, offset + 24); seedA += part1; seedB = rotateRight(seedB + seedA + part4, 21); long c = seedA; seedA += part2; seedA += part3; seedB += rotateRight(seedA, 44); output[0] = seedA + part4; output[1] = seedB + c; }
int last64offset = end + ((length - 1) & 63) - 63; do { x = rotateRight(x + y + v[0] + load64(bytes, offset + 8), 37) * K1; y = rotateRight(y + v[1] + load64(bytes, offset + 48), 42) * K1; x ^= w[1]; y += v[0] + load64(bytes, offset + 40); z = rotateRight(z + w[0], 33) * K1; weakHashLength32WithSeeds(bytes, offset, v[1] * K1, x + w[0], v); weakHashLength32WithSeeds(bytes, offset + 32, z + w[1], y + load64(bytes, offset + 16), w); v[0] += w[0]; w[0] += v[0]; x = rotateRight(x + y + v[0] + load64(bytes, offset + 8), 37) * mul; y = rotateRight(y + v[1] + load64(bytes, offset + 48), 42) * mul; x ^= w[1] * 9; y += v[0] * 9 + load64(bytes, offset + 40); z = rotateRight(z + w[0], 33) * mul; weakHashLength32WithSeeds(bytes, offset, v[1] * mul, x + w[0], v); weakHashLength32WithSeeds(bytes, offset + 32, z + w[1], y + load64(bytes, offset + 16), w);
private static long hashLength0to16(byte[] bytes, int offset, int length) { if (length >= 8) { long mul = K2 + length * 2; long a = load64(bytes, offset) + K2; long b = load64(bytes, offset + length - 8); long c = rotateRight(b, 37) * mul + a; long d = (rotateRight(a, 25) + b) * mul; return hashLength16(c, d, mul); } if (length >= 4) { long mul = K2 + length * 2; long a = load32(bytes, offset) & 0xFFFFFFFFL; return hashLength16(length + (a << 3), load32(bytes, offset + length - 4) & 0xFFFFFFFFL, mul); } if (length > 0) { byte a = bytes[offset]; byte b = bytes[offset + (length >> 1)]; byte c = bytes[offset + (length - 1)]; int y = (a & 0xFF) + ((b & 0xFF) << 8); int z = length + ((c & 0xFF) << 2); return shiftMix(y * K2 ^ z * K0) * K2; } return K2; }
int last64offset = end + ((length - 1) & 63) - 63; do { x = rotateRight(x + y + v[0] + load64(bytes, offset + 8), 37) * K1; y = rotateRight(y + v[1] + load64(bytes, offset + 48), 42) * K1; x ^= w[1]; y += v[0] + load64(bytes, offset + 40); z = rotateRight(z + w[0], 33) * K1; weakHashLength32WithSeeds(bytes, offset, v[1] * K1, x + w[0], v); weakHashLength32WithSeeds(bytes, offset + 32, z + w[1], y + load64(bytes, offset + 16), w); v[0] += w[0]; w[0] += v[0]; x = rotateRight(x + y + v[0] + load64(bytes, offset + 8), 37) * mul; y = rotateRight(y + v[1] + load64(bytes, offset + 48), 42) * mul; x ^= w[1] * 9; y += v[0] * 9 + load64(bytes, offset + 40); z = rotateRight(z + w[0], 33) * mul; weakHashLength32WithSeeds(bytes, offset, v[1] * mul, x + w[0], v); weakHashLength32WithSeeds(bytes, offset + 32, z + w[1], y + load64(bytes, offset + 16), w);
private static long hashLength0to16(byte[] bytes, int offset, int length) { if (length >= 8) { long mul = K2 + length * 2; long a = load64(bytes, offset) + K2; long b = load64(bytes, offset + length - 8); long c = rotateRight(b, 37) * mul + a; long d = (rotateRight(a, 25) + b) * mul; return hashLength16(c, d, mul); } if (length >= 4) { long mul = K2 + length * 2; long a = load32(bytes, offset) & 0xFFFFFFFFL; return hashLength16(length + (a << 3), load32(bytes, offset + length - 4) & 0xFFFFFFFFL, mul); } if (length > 0) { byte a = bytes[offset]; byte b = bytes[offset + (length >> 1)]; byte c = bytes[offset + (length - 1)]; int y = (a & 0xFF) + ((b & 0xFF) << 8); int z = length + ((c & 0xFF) << 2); return shiftMix(y * K2 ^ z * K0) * K2; } return K2; }
int last64offset = end + ((length - 1) & 63) - 63; do { x = rotateRight(x + y + v[0] + load64(bytes, offset + 8), 37) * K1; y = rotateRight(y + v[1] + load64(bytes, offset + 48), 42) * K1; x ^= w[1]; y += v[0] + load64(bytes, offset + 40); z = rotateRight(z + w[0], 33) * K1; weakHashLength32WithSeeds(bytes, offset, v[1] * K1, x + w[0], v); weakHashLength32WithSeeds(bytes, offset + 32, z + w[1], y + load64(bytes, offset + 16), w); v[0] += w[0]; w[0] += v[0]; x = rotateRight(x + y + v[0] + load64(bytes, offset + 8), 37) * mul; y = rotateRight(y + v[1] + load64(bytes, offset + 48), 42) * mul; x ^= w[1] * 9; y += v[0] * 9 + load64(bytes, offset + 40); z = rotateRight(z + w[0], 33) * mul; weakHashLength32WithSeeds(bytes, offset, v[1] * mul, x + w[0], v); weakHashLength32WithSeeds(bytes, offset + 32, z + w[1], y + load64(bytes, offset + 16), w);
private static long hashLength0to16(byte[] bytes, int offset, int length) { if (length >= 8) { long mul = K2 + length * 2; long a = load64(bytes, offset) + K2; long b = load64(bytes, offset + length - 8); long c = rotateRight(b, 37) * mul + a; long d = (rotateRight(a, 25) + b) * mul; return hashLength16(c, d, mul); } if (length >= 4) { long mul = K2 + length * 2; long a = load32(bytes, offset) & 0xFFFFFFFFL; return hashLength16(length + (a << 3), load32(bytes, offset + length - 4) & 0xFFFFFFFFL, mul); } if (length > 0) { byte a = bytes[offset]; byte b = bytes[offset + (length >> 1)]; byte c = bytes[offset + (length - 1)]; int y = (a & 0xFF) + ((b & 0xFF) << 8); int z = length + ((c & 0xFF) << 2); return shiftMix(y * K2 ^ z * K0) * K2; } return K2; }
int last64offset = end + ((length - 1) & 63) - 63; do { x = rotateRight(x + y + v[0] + load64(bytes, offset + 8), 37) * K1; y = rotateRight(y + v[1] + load64(bytes, offset + 48), 42) * K1; x ^= w[1]; y += v[0] + load64(bytes, offset + 40); z = rotateRight(z + w[0], 33) * K1; weakHashLength32WithSeeds(bytes, offset, v[1] * K1, x + w[0], v); weakHashLength32WithSeeds(bytes, offset + 32, z + w[1], y + load64(bytes, offset + 16), w); v[0] += w[0]; w[0] += v[0]; x = rotateRight(x + y + v[0] + load64(bytes, offset + 8), 37) * mul; y = rotateRight(y + v[1] + load64(bytes, offset + 48), 42) * mul; x ^= w[1] * 9; y += v[0] * 9 + load64(bytes, offset + 40); z = rotateRight(z + w[0], 33) * mul; weakHashLength32WithSeeds(bytes, offset, v[1] * mul, x + w[0], v); weakHashLength32WithSeeds(bytes, offset + 32, z + w[1], y + load64(bytes, offset + 16), w);