Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 适合小班学生吗?(覆盖GetHashCode)_C#_Gethashcode - Fatal编程技术网

C# 适合小班学生吗?(覆盖GetHashCode)

C# 适合小班学生吗?(覆盖GetHashCode),c#,gethashcode,C#,Gethashcode,我使用一些包含1-2个整数的标识类/结构,也可能是datetime或小字符串。我用这些作为字典的索引 对于这样的东西,什么是对GetHashCode的良好重写?一些非常简单但仍有希望的东西 谢谢看看吧 它包含关于如何正确覆盖GetHashCode()的详细说明 摘自该书 哈希代码的目的是通过生成与对象的值相对应的数字来有效地平衡哈希表 必需:相等的对象必须具有相等的哈希代码(如果a.Equals(b),则a.GetHashCode()==b.GetHashCode()) 必需:GetHashC

我使用一些包含1-2个整数的标识类/结构,也可能是datetime或小字符串。我用这些作为字典的索引

对于这样的东西,什么是对GetHashCode的良好重写?一些非常简单但仍有希望的东西

谢谢

看看吧

它包含关于如何正确覆盖
GetHashCode()
的详细说明

摘自该书 哈希代码的目的是通过生成与对象的值相对应的数字来有效地平衡哈希表

  • 必需:相等的对象必须具有相等的哈希代码(如果
    a.Equals(b)
    ,则
    a.GetHashCode()==b.GetHashCode()
  • 必需:
    GetHashCode()
    在特定对象的生命周期内返回的值应该是常量(相同的值),即使对象的数据发生了更改。在许多情况下,您应该缓存方法返回以强制执行此操作
  • 必需:
    GetHashCode()
    不应引发任何异常
    GetHashCode()
    必须始终成功返回值
  • 性能:哈希代码应尽可能唯一。但是,由于哈希代码只返回
    int
    ,因此对于具有可能超过int所能容纳的值的对象(实际上是所有类型),哈希代码中必须存在重叠。(一个明显的例子是
    long
    ,因为可能的
    long
    值比
    int
    可以唯一识别的值更多。)
  • 性能:可能的哈希代码值应在
    int
    范围内均匀分布。例如,创建一个不考虑以拉丁语为基础的字符串的分布主要集中在初始的128个ASCII字符上的散列将导致字符串值分布非常不均匀,并且不会是强的<代码> GethasoCudie()/<代码>算法。
  • 性能:
    GetHashCode()
    应针对性能进行优化
    GetHashCode()
    通常用于
    Equals()
    实现中,以在哈希代码不同时缩短完全Equals比较。因此,当该类型用作字典集合中的键类型时,经常调用它
  • 性能:两个对象之间的微小差异应该导致哈希代码值之间的巨大差异——理想情况下,对象中的1位差异平均会导致16位左右的哈希代码更改。这有助于确保哈希表保持平衡,无论它如何“bucking”哈希值
  • 安全性:攻击者应该很难创建具有特定哈希代码的对象。攻击是用大量数据淹没哈希表,这些数据都散列为相同的值。然后,哈希表实现变成O(n)而不是O(1),从而导致可能的拒绝服务攻击

这里已经提到过,您还需要考虑一些关于重写<代码>均衡器()/>代码的问题,并且有一些代码示例说明如何实现这两个函数。


因此,这些信息应该是一个起点,但我建议购买这本书并阅读完整的第9章(至少前十二面)要获得关于如何正确地实现这两个关键功能的所有要点。你的<代码> INT/COS> S有一个特定范围的有效值?积极的INTS,但没有上限。你把这些对象存储在一个字典中,考虑到实现IEQualy比较器接口,你能从书中包含一些洞察力吗?- 1。从什么时候开始,买一本1000页的书就是答案?我相信这是一本很棒的书,但这个答案就像“谷歌it”或“RTFM”。@Jakob:GetHashCode()的问题是,它比你一开始想象的要复杂得多。相反,你必须考虑很多要点才能使它完美无瑕,我想用几句话把它写下来是很重要的。所以,做一个更新,给我们一些启示。希望这能让落选的选票恢复过来这本书是错的。如果对象定义相等的方式可以在其生命周期内更改,则哈希代码必须更改以匹配。让键更改不是一个好主意,但这不是类创建者要确保的责任(尽管如果类是不可变的,他们肯定会指出这使它成为一个好的键选择)。如果identity是等式定义符(默认值),那么它不能更改,而是默认impl。无论如何,这是最好的。