CH.SipHash.SipHash.SipHash_2_4_ForcedInline C# (CSharp) Method

SipHash_2_4_ForcedInline() public static method

public static SipHash_2_4_ForcedInline ( byte inba, ulong k0, ulong k1 ) : ulong
inba byte
k0 ulong
k1 ulong
return ulong
        public static unsafe ulong SipHash_2_4_ForcedInline(byte[] inba, ulong k0, ulong k1)
        {
            var inlen = inba.Length;

            var v0 = 0x736f6d6570736575 ^ k0;
            var v1 = 0x646f72616e646f6d ^ k1;
            var v2 = 0x6c7967656e657261 ^ k0;
            var v3 = 0x7465646279746573 ^ k1;

            var b = ((ulong)inlen) << 56;

            if (inlen > 0)
                fixed (byte* finb = &inba[0])
                {
                    var inb = finb;
                    var left = inlen & 7;
                    var end = inb + inlen - left;
                    for (; inb < end; inb += 8)
                    {
                        var m = inb[0] |
                                (((ulong)inb[1]) << 8) |
                                (((ulong)inb[2]) << 16) |
                                (((ulong)inb[3]) << 24) |
                                (((ulong)inb[4]) << 32) |
                                (((ulong)inb[5]) << 40) |
                                (((ulong)inb[6]) << 48) |
                                (((ulong)inb[7]) << 56);
                        v3 ^= m;

                        v0 += v1;
                        v1 = (v1 << 13) | (v1 >> (64 - 13));
                        v1 ^= v0;
                        v0 = (v0 << 32) | (v0 >> (64 - 32));

                        v2 += v3;
                        v3 = (v3 << 16) | (v3 >> (64 - 16));
                        v3 ^= v2;

                        v0 += v3;
                        v3 = (v3 << 21) | (v3 >> (64 - 21));
                        v3 ^= v0;

                        v2 += v1;
                        v1 = (v1 << 17) | (v1 >> (64 - 17));
                        v1 ^= v2;
                        v2 = (v2 << 32) | (v2 >> (64 - 32));
                        v0 += v1;
                        v1 = (v1 << 13) | (v1 >> (64 - 13));
                        v1 ^= v0;
                        v0 = (v0 << 32) | (v0 >> (64 - 32));

                        v2 += v3;
                        v3 = (v3 << 16) | (v3 >> (64 - 16));
                        v3 ^= v2;

                        v0 += v3;
                        v3 = (v3 << 21) | (v3 >> (64 - 21));
                        v3 ^= v0;

                        v2 += v1;
                        v1 = (v1 << 17) | (v1 >> (64 - 17));
                        v1 ^= v2;
                        v2 = (v2 << 32) | (v2 >> (64 - 32));

                        v0 ^= m;
                    }
                    for (var i = 0; i < left; ++i)
                    {
                        b |= ((ulong)end[i]) << (8 * i);
                    }
                }

            v3 ^= b;
            v0 += v1;
            v1 = (v1 << 13) | (v1 >> (64 - 13));
            v1 ^= v0;
            v0 = (v0 << 32) | (v0 >> (64 - 32));

            v2 += v3;
            v3 = (v3 << 16) | (v3 >> (64 - 16));
            v3 ^= v2;

            v0 += v3;
            v3 = (v3 << 21) | (v3 >> (64 - 21));
            v3 ^= v0;

            v2 += v1;
            v1 = (v1 << 17) | (v1 >> (64 - 17));
            v1 ^= v2;
            v2 = (v2 << 32) | (v2 >> (64 - 32));
            v0 += v1;
            v1 = (v1 << 13) | (v1 >> (64 - 13));
            v1 ^= v0;
            v0 = (v0 << 32) | (v0 >> (64 - 32));

            v2 += v3;
            v3 = (v3 << 16) | (v3 >> (64 - 16));
            v3 ^= v2;

            v0 += v3;
            v3 = (v3 << 21) | (v3 >> (64 - 21));
            v3 ^= v0;

            v2 += v1;
            v1 = (v1 << 17) | (v1 >> (64 - 17));
            v1 ^= v2;
            v2 = (v2 << 32) | (v2 >> (64 - 32));
            v0 ^= b;
            v2 ^= 0xff;

            v0 += v1;
            v1 = (v1 << 13) | (v1 >> (64 - 13));
            v1 ^= v0;
            v0 = (v0 << 32) | (v0 >> (64 - 32));

            v2 += v3;
            v3 = (v3 << 16) | (v3 >> (64 - 16));
            v3 ^= v2;

            v0 += v3;
            v3 = (v3 << 21) | (v3 >> (64 - 21));
            v3 ^= v0;

            v2 += v1;
            v1 = (v1 << 17) | (v1 >> (64 - 17));
            v1 ^= v2;
            v2 = (v2 << 32) | (v2 >> (64 - 32));
            v0 += v1;
            v1 = (v1 << 13) | (v1 >> (64 - 13));
            v1 ^= v0;
            v0 = (v0 << 32) | (v0 >> (64 - 32));

            v2 += v3;
            v3 = (v3 << 16) | (v3 >> (64 - 16));
            v3 ^= v2;

            v0 += v3;
            v3 = (v3 << 21) | (v3 >> (64 - 21));
            v3 ^= v0;

            v2 += v1;
            v1 = (v1 << 17) | (v1 >> (64 - 17));
            v1 ^= v2;
            v2 = (v2 << 32) | (v2 >> (64 - 32));
            v0 += v1;
            v1 = (v1 << 13) | (v1 >> (64 - 13));
            v1 ^= v0;
            v0 = (v0 << 32) | (v0 >> (64 - 32));

            v2 += v3;
            v3 = (v3 << 16) | (v3 >> (64 - 16));
            v3 ^= v2;

            v0 += v3;
            v3 = (v3 << 21) | (v3 >> (64 - 21));
            v3 ^= v0;

            v2 += v1;
            v1 = (v1 << 17) | (v1 >> (64 - 17));
            v1 ^= v2;
            v2 = (v2 << 32) | (v2 >> (64 - 32));
            v0 += v1;
            v1 = (v1 << 13) | (v1 >> (64 - 13));
            v1 ^= v0;
            v0 = (v0 << 32) | (v0 >> (64 - 32));

            v2 += v3;
            v3 = (v3 << 16) | (v3 >> (64 - 16));
            v3 ^= v2;

            v0 += v3;
            v3 = (v3 << 21) | (v3 >> (64 - 21));
            v3 ^= v0;

            v2 += v1;
            v1 = (v1 << 17) | (v1 >> (64 - 17));
            v1 ^= v2;
            v2 = (v2 << 32) | (v2 >> (64 - 32));

            return v0 ^ v1 ^ v2 ^ v3;
        }