.net - 如何计算字符串列表的良好哈希码?

标签 .net database-design hashcode

背景:

  • 我有一个简短的字符串列表。
  • 字符串的数量并不总是相同,但几乎总是“少数”的量级
  • 在我们的数据库中,会将这些字符串存储在第二个标准化表中
  • 这些字符串一旦写入数据库就永不更改。

我们希望能够在查询中快速匹配这些字符串,而不会因进行大量连接而影响性能。

所以我正在考虑将所有这些字符串的哈希码存储在主表中并将其包含在我们的索引中,这样只有当哈希码匹配时数据库才会处理连接。

那么如何获得好的哈希码呢?我可以:

  • 将所有字符串的哈希码异或在一起
  • 异或将每个字符串后的结果相乘(例如乘以 31)
  • 将所有字符串放在一起,然后获取哈希码
  • 其他方式

那么人们怎么想?

<小时/>

最后,我只是连接字符串并计算连接的哈希码,因为它很简单并且工作得很好。

(如果您关心的话,我们正在使用 .NET 和 SqlServer)

<小时/>

错误!错误!

Quoting from Guidelines and rules for GetHashCode作者:埃里克·利珀特

The documentation for System.String.GetHashCode notes specifically that two identical strings can have different hash codes in different versions of the CLR, and in fact they do. Don't store string hashes in databases and expect them to be the same forever, because they won't be.

因此 String.GetHashcode() 不应用于此目的。

最佳答案

标准的java实践,就是简单的写

final int prime = 31;
int result = 1;
for( String s : strings )
{
    result = result * prime + s.hashCode();
}
// result is the hashcode.

关于.net - 如何计算字符串列表的良好哈希码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2730865/

相关文章:

.net - log4net 没有登录到数据库

ruby-on-rails - 博客架构设计

Java:哈希函数输入的字符串

.net - 我可以使用 VS2010 的 Intellitrace 收集 Windows 服务的数据吗?

c# - 线程安全的单元测试?

.net - 通过 ADO.Net 和 COM 互操作性进行 MS Access 批量更新

database-design - 数据库中的 bool 标志对于此选项列表是否可接受?

mysql - SQL表设计问题

java - 使用哈希码比较 Map 的关键元素

java - 计算hashCode时转换数据类型