예제 #1
0
        /// <summary>
        /// Get the 64-bit FNV hash for use as the IID
        /// for a CLIP, but ignoring age and species.
        /// </summary><param name="text">
        /// The CLIP name to get the generic hash for.
        /// </param><returns>The generic hash value.</returns>
        public static ulong GetGenericHash(string text)
        {
            string value = GetGenericValue(text);

            ulong hash = FNVHash.HashString64(text);

            hash &= 0x7FFFFFFFFFFFFFFF;

            return(hash);
        }
예제 #2
0
        /// <summary>
        /// Get the 64-bit FNV hash for use as the IID
        /// for a CLIP of a given name.
        /// </summary><param name="text">
        /// The CLIP name to get the hash for.
        /// </param><returns>The hash value.</returns>
        public static ulong HashString(string text)
        {
            string value = text;
            ulong  mask  = 0;

            int index = text.IndexOf('_', 0, text.Length);

            if (index > 0 && index <= 5)
            {
                string x2y    = FNVHash.SubstringToLower(text, 0, index);
                int    index2 = x2y.IndexOf('2', 0, index);
                if (index2 > 0 && index2 <= 2)
                {
                    string x = x2y.Substring(0, index2);
                    string y = x2y.Substring(index2 + 1);
                    if (y.Length > 0 && !(isAO(x) && isAO(y)))
                    {
                        byte xAge = Mask(x);
                        byte yAge = Mask(y);
                        value = string.Concat(
                            (x[0] == 'o' ? "o" : "a"), "2",
                            (y[0] == 'o' ? "o" : "a"), "_",
                            text.Substring(index + 1));
                        mask = (ulong)(0x8000 | xAge << 8 | yAge);
                    }
                }
                else if (!isAO(x2y))
                {
                    byte xAge = Mask(x2y);
                    value = string.Concat("a_", text.Substring(index + 1));
                    mask  = (ulong)(0x8000 | xAge << 8);
                }
            }

            ulong hash = FNVHash.HashString64(value);

            hash &= 0x7FFFFFFFFFFFFFFF;
            hash ^= mask << 48;

            return(hash);
        }