diff options
Diffstat (limited to 'Client/Assembly-CSharp/XXHash.cs')
-rw-r--r-- | Client/Assembly-CSharp/XXHash.cs | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/Client/Assembly-CSharp/XXHash.cs b/Client/Assembly-CSharp/XXHash.cs new file mode 100644 index 0000000..5845560 --- /dev/null +++ b/Client/Assembly-CSharp/XXHash.cs @@ -0,0 +1,189 @@ +using System; + +public class XXHash +{ + private uint seed; + + private const uint PRIME32_1 = 2654435761U; + + private const uint PRIME32_2 = 2246822519U; + + private const uint PRIME32_3 = 3266489917U; + + private const uint PRIME32_4 = 668265263U; + + private const uint PRIME32_5 = 374761393U; + + public XXHash(int seed) + { + this.seed = (uint)seed; + } + + public uint GetHash(byte[] buf) + { + int i = 0; + int num = buf.Length; + uint num3; + if (num >= 16) + { + int num2 = num - 16; + uint value = this.seed + 2654435761U + 2246822519U; + uint value2 = this.seed + 2246822519U; + uint value3 = this.seed; + uint value4 = this.seed - 2654435761U; + do + { + value = XXHash.CalcSubHash(value, buf, i); + i += 4; + value2 = XXHash.CalcSubHash(value2, buf, i); + i += 4; + value3 = XXHash.CalcSubHash(value3, buf, i); + i += 4; + value4 = XXHash.CalcSubHash(value4, buf, i); + i += 4; + } + while (i <= num2); + num3 = XXHash.RotateLeft(value, 1) + XXHash.RotateLeft(value2, 7) + XXHash.RotateLeft(value3, 12) + XXHash.RotateLeft(value4, 18); + } + else + { + num3 = this.seed + 374761393U; + } + num3 += (uint)num; + while (i <= num - 4) + { + num3 += BitConverter.ToUInt32(buf, i) * 3266489917U; + num3 = XXHash.RotateLeft(num3, 17) * 668265263U; + i += 4; + } + while (i < num) + { + num3 += (uint)buf[i] * 374761393U; + num3 = XXHash.RotateLeft(num3, 11) * 2654435761U; + i++; + } + num3 ^= num3 >> 15; + num3 *= 2246822519U; + num3 ^= num3 >> 13; + num3 *= 3266489917U; + return num3 ^ num3 >> 16; + } + + public uint GetHash(params uint[] buf) + { + int i = 0; + int num = buf.Length; + uint num3; + if (num >= 4) + { + int num2 = num - 4; + uint value = this.seed + 2654435761U + 2246822519U; + uint value2 = this.seed + 2246822519U; + uint value3 = this.seed; + uint value4 = this.seed - 2654435761U; + do + { + value = XXHash.CalcSubHash(value, buf[i]); + i++; + value2 = XXHash.CalcSubHash(value2, buf[i]); + i++; + value3 = XXHash.CalcSubHash(value3, buf[i]); + i++; + value4 = XXHash.CalcSubHash(value4, buf[i]); + i++; + } + while (i <= num2); + num3 = XXHash.RotateLeft(value, 1) + XXHash.RotateLeft(value2, 7) + XXHash.RotateLeft(value3, 12) + XXHash.RotateLeft(value4, 18); + } + else + { + num3 = this.seed + 374761393U; + } + num3 += (uint)(num * 4); + while (i < num) + { + num3 += buf[i] * 3266489917U; + num3 = XXHash.RotateLeft(num3, 17) * 668265263U; + i++; + } + num3 ^= num3 >> 15; + num3 *= 2246822519U; + num3 ^= num3 >> 13; + num3 *= 3266489917U; + return num3 ^ num3 >> 16; + } + + public uint GetHash(params int[] buf) + { + int i = 0; + int num = buf.Length; + uint num3; + if (num >= 4) + { + int num2 = num - 4; + uint value = this.seed + 2654435761U + 2246822519U; + uint value2 = this.seed + 2246822519U; + uint value3 = this.seed; + uint value4 = this.seed - 2654435761U; + do + { + value = XXHash.CalcSubHash(value, (uint)buf[i]); + i++; + value2 = XXHash.CalcSubHash(value2, (uint)buf[i]); + i++; + value3 = XXHash.CalcSubHash(value3, (uint)buf[i]); + i++; + value4 = XXHash.CalcSubHash(value4, (uint)buf[i]); + i++; + } + while (i <= num2); + num3 = XXHash.RotateLeft(value, 1) + XXHash.RotateLeft(value2, 7) + XXHash.RotateLeft(value3, 12) + XXHash.RotateLeft(value4, 18); + } + else + { + num3 = this.seed + 374761393U; + } + num3 += (uint)(num * 4); + while (i < num) + { + num3 += (uint)(buf[i] * -1028477379); + num3 = XXHash.RotateLeft(num3, 17) * 668265263U; + i++; + } + num3 ^= num3 >> 15; + num3 *= 2246822519U; + num3 ^= num3 >> 13; + num3 *= 3266489917U; + return num3 ^ num3 >> 16; + } + + public uint GetHash(int buf) + { + uint num = XXHash.RotateLeft(this.seed + 374761393U + 4U + (uint)(buf * -1028477379), 17) * 668265263U; + uint num2 = (num ^ num >> 15) * 2246822519U; + uint num3 = (num2 ^ num2 >> 13) * 3266489917U; + return num3 ^ num3 >> 16; + } + + private static uint CalcSubHash(uint value, byte[] buf, int index) + { + uint num = BitConverter.ToUInt32(buf, index); + value += num * 2246822519U; + value = XXHash.RotateLeft(value, 13); + value *= 2654435761U; + return value; + } + + private static uint CalcSubHash(uint value, uint read_value) + { + value += read_value * 2246822519U; + value = XXHash.RotateLeft(value, 13); + value *= 2654435761U; + return value; + } + + private static uint RotateLeft(uint value, int count) + { + return value << count | value >> 32 - count; + } +} |