在C#中将字符串转换为16位哈希值

3

我看到C#函数String.GetHashCode()被用来返回一个字符串的32位整数哈希值。

我想生成一个简单的16位哈希值,这个字符串的长度将总是9个字符。

有人可以帮忙吗?

谢谢

2个回答

4

使用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位哈希值大小比较安全。


谢谢你,MD5版本正是我需要的 :) - tip2tail

3
你可以通过将string.GetHashCode转换为一个16位数字(shortushort)并取其前16位来简单地获取16位。如果您本来会在checked上下文中运行,则需要包含unchecked关键字。
unchecked
{
    return (short)someString.GetHashCode();
}

引发了一个异常:System.OverflowException: 算术运算导致溢出。 - tip2tail
1
@tip2tail 你必须在“checked”上下文中运行它。包括“unchecked”关键字(我已更新我的答案)。 - Tim S.
你是什么意思?它是16位的哈希值...不像GUID,其中不同的位没有特殊的含义,因此可以合理地假设这是一个好的实现。 - Tim S.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接