Exemplo n.º 1
0
        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)));
                }
            }
        }