public override uint CalculateHash(byte[] data, int length) { if (length > data.Length) { throw new ArgumentOutOfRangeException("length"); } unsafe { fixed(byte *data8 = data) { ulong hash = 0; ulong key = 0; ulong *data64 = (ulong *)data8; for (int i = length / 8; i > 0; --i) { hash = MMX.PAddW(hash, 0xA35793A7A35793A7ul); key = MMX.PAddW(key, *data64++ ^ hash); key = MMX.PSllD(key, 3) | MMX.PSrlD(key, 29); } // MMX.PMAddWD (key, key >> 32); return((uint)((short)key * (short)(key >> 32) + (short)(key >> 16) * (short)(key >> 48))); } } }