2013-11-14 52 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