在C#中获取16位字符串哈希值

时间:2013-11-14 18:18:03

标签: c# hash 16-bit

我已经看到C#函数String.GetHashCode();用于返回字符串的32位整数哈希值。

我想生成一个字符串值的简单16位哈希值。该字符串的长度始终为9个字符。

有人可以帮忙吗?

由于

2 个答案:

答案 0 :(得分:3)

您只需将string.GetHashCode中的16位转换为16位数字(shortushort)即可。如果您要在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位。