Пример #1
0
        public static void BuildHashCodesTable(Type type, out int[] values, out ulong[] hashCodes)
        {
            var fields       = type.GetFields(BindingFlags.Public | BindingFlags.Static);
            var enumValues   = fields.Select(field => ConvertToInt(Enum.Parse(type, field.Name), type.GetEnumUnderlyingType())).ToArray();
            var uniqueValues = new HashSet <int>(enumValues).ToArray();
            var nameHashes   = GroBufHelpers.CalcHashesAndCheck(fields.Select(DataMember.Create));
            var hashSet      = new HashSet <uint>();

            for (var x = (uint)enumValues.Length;; ++x)
            {
                hashSet.Clear();
                var ok = true;
                foreach (var value in uniqueValues)
                {
                    var item = ((uint)value) % x;
                    if (hashSet.Contains(item))
                    {
                        ok = false;
                        break;
                    }
                    hashSet.Add(item);
                }
                if (!ok)
                {
                    continue;
                }
                hashCodes = new ulong[x];
                values    = new int[x];
                for (var i = 0; i < x; ++i)
                {
                    values[i] = -1;
                }
                for (var i = 0; i < enumValues.Length; i++)
                {
                    var value = enumValues[i];
                    var index = ((uint)value) % x;
                    hashCodes[index] = nameHashes[i];
                    values[index]    = value;
                }
                break;
            }
        }
Пример #2
0
        public static void BuildValuesTable(Type type, out int[] values, out ulong[] hashCodes)
        {
            var fields  = type.GetFields(BindingFlags.Public | BindingFlags.Static);
            var arr     = fields.Select(field => ConvertToInt(Enum.Parse(type, field.Name), type.GetEnumUnderlyingType())).ToArray();
            var hashes  = GroBufHelpers.CalcHashesAndCheck(fields.Select(DataMember.Create));
            var hashSet = new HashSet <uint>();

            for (var x = (uint)hashes.Length;; ++x)
            {
                hashSet.Clear();
                var ok = true;
                foreach (var hash in hashes)
                {
                    var item = (uint)(hash % x);
                    if (hashSet.Contains(item))
                    {
                        ok = false;
                        break;
                    }
                    hashSet.Add(item);
                }
                if (!ok)
                {
                    continue;
                }
                hashCodes = new ulong[x];
                values    = new int[x];
                for (var i = 0; i < hashes.Length; i++)
                {
                    var hash  = hashes[i];
                    var index = (int)(hash % x);
                    hashCodes[index] = hash;
                    values[index]    = (int)arr.GetValue(i);
                }
                return;
            }
        }