字符串的持久哈希码
Persistent hashcode for strings
我想为字符串生成一个整数哈希码,它将永远保持不变;即相同的字符串应该总是产生相同的哈希码。
散列不必是加密安全的,它不会用于密码或敏感数据。
我的第一次尝试是使用 .net 框架 string.GetHashCode() 函数。
但是,在阅读资料后,我发现了以下评论:
// We want to ensure we can change our hash function daily.
// This is perfectly fine as long as you don't persist the
// value from GetHashCode to disk or count on String A
// hashing before string B. Those are bugs in your code.
hash1 ^= ThisAssembly.DailyBuildNumber;
这似乎表明哈希码不会保持不变。
如果是这样,框架是否有另一种方法来生成可重复的哈希码?还是 GetHashCode 中的代码是实现我自己的代码的合理起点?
我正在寻找尽可能轻便和快速的东西。
我找到了 System.Security.Cryptography.MD5,但对于一个简单的 int32 哈希码来说这似乎有点过分了,我担心开销。至少它需要从字符串到字节数组的转换,从字节数组到 int 的转换,或者为每个散列创建一个新的 MD5()
对象,或者管理一些静态共享 MD5 对象().
没有内置的、跨版本稳定的方法来获取字符串的哈希码。
您可以只复制现有的 GetHashCode()
代码,但排除将内部版本号添加为种子的部分,并且不要使用不安全的调用来保护自己免受实施细节更改的影响。
这是 64bit GetHashCode()
的完全托管版本,它不使用任何随机化,并且 return 所有未来版本的 .NET 的值都相同(只要 int ^ char
永远不会改变)。
public static class StringExtensionMethods
{
public static int GetStableHashCode(this string str)
{
unchecked
{
int hash1 = 5381;
int hash2 = hash1;
for(int i = 0; i < str.Length && str[i] != '[=10=]'; i += 2)
{
hash1 = ((hash1 << 5) + hash1) ^ str[i];
if (i == str.Length - 1 || str[i+1] == '[=10=]')
break;
hash2 = ((hash2 << 5) + hash2) ^ str[i+1];
}
return hash1 + (hash2*1566083941);
}
}
}
我想为字符串生成一个整数哈希码,它将永远保持不变;即相同的字符串应该总是产生相同的哈希码。
散列不必是加密安全的,它不会用于密码或敏感数据。
我的第一次尝试是使用 .net 框架 string.GetHashCode() 函数。 但是,在阅读资料后,我发现了以下评论:
// We want to ensure we can change our hash function daily. // This is perfectly fine as long as you don't persist the // value from GetHashCode to disk or count on String A // hashing before string B. Those are bugs in your code. hash1 ^= ThisAssembly.DailyBuildNumber;
这似乎表明哈希码不会保持不变。
如果是这样,框架是否有另一种方法来生成可重复的哈希码?还是 GetHashCode 中的代码是实现我自己的代码的合理起点?
我正在寻找尽可能轻便和快速的东西。
我找到了 System.Security.Cryptography.MD5,但对于一个简单的 int32 哈希码来说这似乎有点过分了,我担心开销。至少它需要从字符串到字节数组的转换,从字节数组到 int 的转换,或者为每个散列创建一个新的 MD5()
对象,或者管理一些静态共享 MD5 对象().
没有内置的、跨版本稳定的方法来获取字符串的哈希码。
您可以只复制现有的 GetHashCode()
代码,但排除将内部版本号添加为种子的部分,并且不要使用不安全的调用来保护自己免受实施细节更改的影响。
这是 64bit GetHashCode()
的完全托管版本,它不使用任何随机化,并且 return 所有未来版本的 .NET 的值都相同(只要 int ^ char
永远不会改变)。
public static class StringExtensionMethods
{
public static int GetStableHashCode(this string str)
{
unchecked
{
int hash1 = 5381;
int hash2 = hash1;
for(int i = 0; i < str.Length && str[i] != '[=10=]'; i += 2)
{
hash1 = ((hash1 << 5) + hash1) ^ str[i];
if (i == str.Length - 1 || str[i+1] == '[=10=]')
break;
hash2 = ((hash2 << 5) + hash2) ^ str[i+1];
}
return hash1 + (hash2*1566083941);
}
}
}