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

问题描述 投票:0回答:2

我见过 C# 函数

String.GetHashCode();
用于返回字符串的 32 位整数哈希值。

我想生成一个简单的 16 位哈希值。 有人可以帮忙吗?

谢谢

c# hash 16-bit
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 位,则通常是安全的哈希大小。


3
投票

您只需将

string.GetHashCode
中的 16 位转换为 16 位数字(
short
ushort
)即可。如果您要在 unchecked
 上下文中运行,则需要包含 
checked
 关键字。

unchecked
{
    return (short)someString.GetHashCode();
}
© www.soinside.com 2019 - 2024. All rights reserved.