64位程式池HashCode相容處理

蘑菇先生發表於2013-12-22

背景

net舊專案使用32位生成的HashCode,儲存到資料庫中。遷移到64位上,就需要對HashCode做相容處理。

解決方案

1:程式池配置支援32位程式。

2:對Hashcode做相容處理,【推薦】。

相容實現

 static void Main(string[] args)
        {

            string test = "hello";

            //-327419862  64位下
            //-695839  32位下
            int bit = test.GetHashCode();

            int hashCode = CompatibleHash("hello");
        }
        /// <summary>
        /// 64位環境下,生成相容32位的hashCode。
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static unsafe int CompatibleHash(string str)
        {
            fixed (char* charPtr = new String(str.ToCharArray()))
            {
                int hashCode = (5381 << 16) + 5381;
                int numeric = hashCode;
                int* intPtr = (int*)charPtr;
                for (int i = str.Length; i > 0; i -= 4)
                {
                    hashCode = ((hashCode << 5) + hashCode + (hashCode >> 27)) ^ intPtr[0];

                    if (i <= 2) break;
                    numeric = ((numeric << 5) + numeric + (numeric >> 27)) ^ intPtr[1];
                    intPtr += 2;
                }
                return hashCode + numeric * 1566083941;
            }
        }

 

相關文章