|
|
1
1664
我通常会使用Josh Bloch的实现 极好的 Effective Java . 它的速度很快,并且创建了一个很好的散列,不太可能引起冲突。选择两个不同的素数,例如17和23,然后执行以下操作:
正如在注释中所指出的,您可能会发现最好选择一个大素数来相乘。显然486187739很好。。。尽管我看到的大多数小数字的例子都倾向于使用素数,但至少有类似的算法经常使用非素数。在不完全- FNV 不过,这是最好的。我不知道这有多重要。)
这比一般的
This page
提供了很多选择。我认为在大多数情况下,以上这些都是“足够好”的,而且非常容易记住和纠正。这个
FNV
alternative同样简单,但使用不同的常量和
根据 documentation :
|
|
|
2
470
ValueTuple-C#7的更新正如@cactualoid在注释中提到的,可以使用值元组。这节省了一些击键,更重要的是纯粹在堆栈上执行(没有垃圾):
(注意:最初使用匿名类型的技术似乎是在堆上创建一个对象,即垃圾,因为匿名类型是作为类实现的,尽管编译器可能会对此进行优化。对这些选项进行基准测试是很有趣的,但是tuple选项应该更好。) 匿名类型(原始答案)
这将适用于任何数量的属性。它不使用拳击。它只使用已经在匿名类型框架中实现的算法。 |
|
|
3
106
这是我的hashcode助手。
|
|
|
4
71
.NET Standard 2.1及更高版本System.HashCode 结构。有两种使用方法: 哈希码。合并
这个
哈希代码。添加
这个
你可以阅读完整的博客文章 GetHashCode Made Easy '了解更多细节和评论。
实施
什么是好的算法?计算散列码的算法需要很快。一个简单的算法通常会更快。不分配额外内存的方法也会减少垃圾收集的需要,这反过来也会提高性能。 确定性deterministic i、 给定相同的输入,它必须总是产生相同的输出。
计算哈希代码的算法需要保留
hash collisions
一分钟。哈希冲突是两个调用
阻止的DoS在.NETCore中,每次重新启动应用程序时,都会得到不同的哈希代码。这是防止拒绝服务攻击(DoS)的安全功能。对于.NET Framework 通过添加以下内容启用此功能应用程序配置文件:
由于此功能,哈希代码决不能在创建它们的应用程序域之外使用,决不能用作集合中的键字段,也决不能持久化。 了解更多信息 here . 加密安全?
|
|
|
5
63
我在Helper库中有一个Hashing类,我将它用于此目的。
我没有评估它的性能,所以欢迎任何反馈。 |
|
|
6
59
下面是我的助手类使用 Jon Skeet's implementation .
如果要避免为编写扩展方法系统.Int32:
它仍然避免了任何堆分配,使用方式完全相同:
编辑(2018年5月):
|
|
|
7
30
没有分配 ,请)快点( 没有繁重的计算 繁重的工作应该是Equals()方法的一部分;哈希应该是一个非常廉价的操作,以便能够对尽可能少的项调用Equals()。 最后一点提示: 不要依赖GetHashCode()在多个应用程序运行中保持稳定 . 许多.Net类型不能保证它们的哈希代码在重新启动后保持不变,因此只能对内存中的数据结构使用GetHashCode()的值。 |
|
|
8
25
简直糟透了。因此,经过一些实验和研究,我开始用以下内容重新散列我的散列:
然后我的两个哈希表的能力就没有了。
不过,这让我很不安,因为上面的方法不应该奏效。或者更确切地说,它不应该工作,除非原来的
重新混合一个hashcode并不能改进一个好的hashcode,因为唯一可能的效果是我们引入了更多的冲突。
重新混合散列代码只能改进散列代码,至少在避免整个范围内的绝对冲突方面做得相当好(2) 可能的值),但在哈希表中实际使用时,在避免冲突方面做得很差。虽然两个表的幂的简单模使这一点更加明显,但它对更常见的素数表也有负面影响,只是没有那么明显(重新灰化的额外工作将超过好处,但好处仍然存在)。
好吧,令人不安的是
我在过去编写的所有GetHashCode()实现,实际上在这个站点上用作答案的基础,都比我想象的要糟糕得多 . 很多时候它对很多用途来说都“足够好”,但我想要更好的。
最后我决定移植 SpookyHash 到.NET。实际上,上面的代码是使用SpookyHash从32位输入生成32位输出的快速路径版本。
然后我把 那个 项目的一方,因为正如原来的项目产生了如何产生更好的哈希代码的问题,所以项目产生了如何产生更好的.NET内存的问题。
它的速度很快,Bob Jenkins值得称赞,因为他最初移植的代码速度更快,尤其是在64位机器上,算法得到了优化。 https://bitbucket.org/JonHanna/spookilysharp/src 然而,由于它现在已经写好了,人们可以更容易地使用它:
它还接受种子值,因此如果您需要处理不受信任的输入并希望防止哈希DoS攻击,则可以根据正常运行时间或类似情况设置种子,并使攻击者无法预测结果:
*一个很大的惊喜是,hand内联了一个返回的旋转方法
|
|
|
9
15
https://github.com/dotnet/coreclr/pull/14863 ,有一种生成哈希代码的新方法,非常简单!写吧
这将生成高质量的哈希代码,而不必担心实现细节。 |
|
|
10
13
这是一个很好的例子:
下面是如何使用它:
|
|
|
11
9
下面是另一个流畅的 the algorithm posted above by Jon Skeet ,但不包括分配或装箱操作:
编译器将确保
|
|
|
12
8
这是我的简单方法。我使用的是经典的生成器模式。它是类型安全的(没有装箱/拆箱),并且与.NET2.0兼容(没有扩展方法等)。 用法如下:
以下是acutal builder类:
|
|
|
13
6
这意味着我们可以这么做:
这是从
英语:
如果能更多地了解ROL-5散列码算法的特性就更好了。
|
|
|
14
5
ReSharper
用户可以使用
|
|
|
15
3
我的大部分工作都是通过数据库连接完成的,这意味着我的类都有一个来自数据库的唯一标识符。我总是使用数据库中的ID来生成hashcode。
|
|
|
16
3
与nightcoder的解决方案非常相似,只是如果你想提高素数会更容易。
|
|
|
17
2
对于多类型也一样:都首先转换为
您可以将多个值转换为哈希值,其中一些值是相同的,因此不要将其用作标识符。(也许有一天我会用到你的组件) |
|
|
18
1
此测试失败(浮动;哈希相同,即使我将2个值切换为负值):
但是这个测试通过了(ints):
我改变了我的实现,不使用GetHashCode来处理基元类型,它似乎工作得更好
|
|
|
19
1
这是一个实现Josh Bloch实现的静态助手类;它提供显式重载来“防止”装箱,还专门为长原语实现哈希。
因为散列输出总是一个int,所以可以直接链接散列调用。
|
|
|
20
0
如果你想填充
注意:如果与
|
|
21
0
可以尝试采用C++ Boost库的方法。像这样:
然后:
|
|
|
22
0
我想把我的最新发现添加到我经常回到的这个话题上。 我当前的visualstudio/项目设置提供了自动将元组重构为结构的功能。这将生成一个GetHashCode函数,如下所示:
|
|
|
AlwaysneedsHelp · 如何减少此处使用的内存量? 2 年前 |
|
|
snake123 · 滚动到不同页面的锚点,URL中没有# 2 年前 |
|
|
Jan · 密码salt是否应存储在数据库中 2 年前 |
|
|
birb · RFC-6238 TOTP实现与示例不匹配 2 年前 |
|
|
AishaWho · 请解释res=id^(id>>>32) 3 年前 |
|
|
landings · 如何散列整数的环形缓冲区? 3 年前 |