我看到C#函数String.GetHashCode()
被用来返回一个字符串的32位整数哈希值。
我想生成一个简单的16位哈希值,这个字符串的长度将总是9个字符。
有人可以帮忙吗?
谢谢
使用GetHashCode()
需要注意。该函数只保证在给定应用程序域中返回相同的哈希值,对于相同的字符串值,在不同平台和版本上它的返回值可能会不同。因此,如果您打算存储此哈希值以供日后使用或发送出去,可能会有意外发生。另外,这是一个更快的哈希函数。以下是如何在不需要unchecked的情况下使用它的方法:
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位哈希值大小比较安全。
string.GetHashCode
转换为一个16位数字(short
或ushort
)并取其前16位来简单地获取16位。如果您本来会在checked
上下文中运行,则需要包含unchecked
关键字。unchecked
{
return (short)someString.GetHashCode();
}
System.OverflowException: 算术运算导致溢出。
- tip2tail