我已经看到C#函数String.GetHashCode();
用于返回字符串的32位整数哈希值。
我想生成一个字符串值的简单16位哈希值。该字符串的长度始终为9个字符。
有人可以帮忙吗?
由于
答案 0 :(得分:3)
您只需将string.GetHashCode
中的16位转换为16位数字(short
或ushort
)即可。如果您要在checked
上下文中运行,则需要添加unchecked
关键字。
unchecked
{
return (short)someString.GetHashCode();
}
答案 1 :(得分: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位。