【问题标题】:Different Hash code for same arrays in C#C#中相同数组的不同哈希码
【发布时间】:2011-01-08 14:53:39
【问题描述】:

这是伪代码

sbyte[] array1 = new sbyte[100]; 
array1.setValues(); 
sbyte[] array2 = (sbyte[])array1.Clone();

但是array1.getHashCode()不等于array2.getHashCode()

我应该怎么做才能让 array1 和 array2 获得相同的哈希码?

P.S:字典没用。因为我想将这些数组添加到哈希表中。每次添加后,我都需要检查之前添加的可能相同的内容数组。

P.S2:看来我应该澄清一下我的问题。起初我在Using Hash in C# 上发布了完整的问题,当它解决后,这个问题被提出来了。

【问题讨论】:

  • 感谢您的编辑。如何突出显示代码部分?
  • 选择代码并使用ctrl + K
  • 你一直说字典很有用,因为你想使用哈希表。字典哈希表...

标签: c# arrays hashcode


【解决方案1】:

这不是同一个数组——它是一个具有相同内容的不同数组。

数组 GetHashCode() 不会散列 内容。该哈希是 reference 的简单哈希。

如果需要字典等,您可以编写自定义 IEqualityComparer<sbyte[]>

【讨论】:

  • Marc 你是对的,但在上一个问题stackoverflow.com/questions/4634201/using-hash-in-c/… 中看到了 Masoud 的问题
  • 字典太慢了。我想将这些数组添加到哈希表中。并检查任何可能添加的相同数组。速度对我来说很重要。哈希会在一两个内存引用中找到任何对象。所以字典没用。
  • 注意:克隆后数组也不相等。所以散列和平等契约仍然完好无损,你看到的是期望的行为。
  • 感谢赛义德的帮助。我试图在另一篇文章中说明我的问题。我的第一个问题在其他帖子中得到解决。但似乎又提出了一个问题。我又写了一篇文章。
  • @masoud a:你的意思是字典太慢了?用什么衡量标准?另外 - 你说你想要不同的哈希码,但问为什么它们不一样:请澄清你想要哪个?但是带有自定义比较器的字典在这里应该是理想的。
【解决方案2】:

无法从数组类中覆盖 GetHashCode 方法。但是您可以将数组包装在另一个类中,然后它们使用其中的一些项来指定其哈希键。

public class WrappedArray
{
  sbyte[] _inner = new sbyte[10]

  //...

  override public int GetHashCode()
  {
    return _inner[0] ^ _inner[1] ^ _inner[2];
  }
}

这只是一个想法。每个对象的哈希码不需要是唯一的,因为哈希结构旨在处理冲突。

【讨论】:

  • 这是个好主意。但有一个问题。数组不是那么可预测的。许多数组在它们的许多块中具有相同的值。并且未知块的差异很小。
  • 散列的想法是通过尝试实现 O(1) 复杂度来提高性能。然而,它接受了一个事实,即有时它是不可能的(这就是为什么它被设计用来处理碰撞)。两个不同的对象可能具有相同的哈希码,它们将被放置在同一个桶上,并且该桶上的所有对象将通过调用 Equals 方法进行相等性比较。 Equals 方法是定义两个对象是否相等的底线,hashcode 只是提高集合访问时间的“技巧”。
  • 是真的卡洛斯。例如,我有 20000 个数组。而且我知道我有 10000 对相同的内容数组。但我不知道是否会出现差异。所以我需要使用一个好的哈希码。或者去实现它。
  • 如果你在没有匹配的情况下覆盖 GetHashCode,那么实现就会被破坏。
  • 被认为相等的两个对象必须具有相同的哈希码,但相反的不一定是正确的。两个不同的对象可以有相同的哈希码。在第 226 页的框架设计指南中,Christopher Brumme 说:“如果 obj1.Equals(obj2) 返回 true,则两个对象应具有相同的哈希码。如果对象不相等,它们可能具有或可能不具有相同哈希码。严格来说,所有对象的哈希码都可能为 1。当然,从性能的角度来看,在哈希表中查找此类项目时,这确实很糟糕。我100%同意他。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-08
  • 2015-02-25
  • 1970-01-01
  • 1970-01-01
  • 2020-03-25
  • 2019-05-08
相关资源
最近更新 更多