コード例 #1
0
        public static unsafe int GetHashCode(void *dataPtr, TypeInfo typeInfo)
        {
            if (typeInfo.GetHashFn != null)
            {
                TypeInfo.GetHashCodeDelegate fn = (TypeInfo.GetHashCodeDelegate)typeInfo.GetHashFn;
                return(fn(dataPtr));
            }

            return(Hash32((byte *)dataPtr, typeInfo.TypeSize));
        }
コード例 #2
0
        public static unsafe int GetHashCode(void *dataPtr, TypeInfo typeInfo)
        {
#if !NET_DOTS
            if (typeInfo.GetHashFn != null)
            {
                TypeInfo.GetHashCodeDelegate fn = (TypeInfo.GetHashCodeDelegate)typeInfo.GetHashFn;
                return(fn(dataPtr));
            }
#endif

            var  layout = typeInfo.Layouts;
            var  data   = (byte *)dataPtr;
            uint hash   = 0;

            for (var k = 0; k != layout.Length; k++)
            {
                if (layout[k].Aligned4)
                {
                    var dataInt = (uint *)(data + layout[k].offset);
                    var count   = layout[k].count;
                    for (var i = 0; i != count; i++)
                    {
                        hash *= FNV_32_PRIME;
                        hash ^= dataInt[i];
                    }
                }
                else
                {
                    var dataByte = data + layout[k].offset;
                    var count    = layout[k].count;
                    for (var i = 0; i != count; i++)
                    {
                        hash *= FNV_32_PRIME;
                        hash ^= dataByte[i];
                    }
                }
            }

            return((int)hash);
        }