背景
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; } }