3

我见过 C# 函数String.GetHashCode();用于返回字符串的 32 位整数哈希。

我想生成一个简单的 16 位字符串值散列。该字符串将始终为 9 个字符长。

有人可以帮忙吗?

谢谢

4

2 回答 2

4

小心使用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 位,则通常是安全的哈希大小。

于 2013-11-15T07:34:14.627 回答
3

您可以string.GetHashCode通过将其转换为 16 位数字(shortushort)来简单地获取 16 位。如果您要在上下文中运行,则需要包含unchecked关键字。checked

unchecked
{
    return (short)someString.GetHashCode();
}
于 2013-11-14T18:18:50.523 回答