2013-11-14 72 views
2

我已經看到C#函數String.GetHashCode();用於返回字符串的32位整數哈希值。在C#中獲取16位字符串的哈希值

我想生成一個簡單的16位字符串值散列。該字符串將始終爲9個字符。

任何人都可以協助嗎?

感謝

回答

3

小心使用GetHashCode()。此功能只能保證爲給定的應用程序域返回相同的散列值。它的返回值可以從平臺更改爲平臺,版本更改爲相同字符串值。因此,如果您稍後將此散列值存儲或發送出去,您可能會感到驚訝。否則,這是一個更快的散列函數。以下是您可以如何使用它,而不需要取消選中:

public static Int16 Get16BitHash(string s) 
{ 
    return (Int16) (s.GetHashCode() & 0xFFFF); 
} 

如果您輕微的性能損失可以使用,那麼您可以使用MD5哈希值。這個散列可以被存儲或傳遞以供以後使用而不用擔心。操作方法如下:

public static Int16 Get16BitHash2(string s) 
{ 
    using (var md5Hasher = MD5.Create()) 
    { 
     var data = md5Hasher.ComputeHash(Encoding.UTF8.GetBytes(s)); 
     return BitConverter.ToInt16(data, 0); 
    } 
} 

請注意:如果生日悖論導致字符串太多,則16位散列很可能會發生衝突。一般安全散列大小,如果128位。

+0

感謝您的支持 - MD5版本正是我需要的:) – tip2tail

3

您可以簡單地通過它強制轉換爲16位數字(shortushort)採取從string.GetHashCode 16位。如果您要在checked上下文中運行,則需要包含unchecked關鍵字。

unchecked 
{ 
    return (short)someString.GetHashCode(); 
} 
+0

這引起了一個異常:'System.OverflowException:算術運算導致溢出.' – tip2tail

+1

@ tip2tail你必須在'checked'上下文中運行它。包括'unchecked'關鍵字(我已經更新了我的答案)。 –

+0

我現在有這個工作,謝謝,但 - 我是對的,以爲這不是一個真正的16位字符串哈希? – tip2tail