Tag: gethashcode

string.GetHashCode()在debug vs release中返回不同的值,我该如何避免这种情况?

令我惊讶的是,下面的方法在debug和release中产生了不同的结果: int result = “test”.GetHashCode(); 有什么方法可以避免这种情况吗? 我需要一种可靠的方法来散列字符串,我需要在调试和发布模式下保持一致的值。 如果可能的话,我想避免编写自己的哈希函数。 为什么会这样? 仅供参考,reflection器给了我: [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail), SecuritySafeCritical] public override unsafe int GetHashCode() { fixed (char* str = ((char*) this)) { char* chPtr = str; int num = 0x15051505; int num2 = num; int* numPtr = (int*) chPtr; for (int i = this.Length; i > 0; i -= 4) { […]

在C#中播种伪随机数生成器

我需要一个C#的Random类实例的种子,我读到大多数人使用当前时间的ticks计数器。 但这是一个64位值,种子需要是32位值。 现在我认为返回int的GetHashCode()方法应该为其对象提供合理分布的值,这可以用于避免仅使用滴答计数的低32位。 但是,我找不到任何关于Int64数据类型的GetHashCode()的信息。 所以,我知道它并不重要,但是下面的工作会像我想的那样好(我不能试错法随机性),或者它的工作原理与使用(int)DateTime.Now.Ticks作为种子? 或者甚至可能更糟糕? 谁可以对此有所了解。 int seed = unchecked(DateTime.Now.Ticks.GetHashCode()); Random r = new Random(seed); 编辑:为什么我需要种子而不只是让Random()构造函数完成工作? 我需要将种子发送给使用相同种子的其他客户端进行相同的随机序列。

使用GetHashCode获取Enum int值

我有一个枚举 public enum INFLOW_SEARCH_ON { ON_ENTITY_HANDLE = 0, ON_LABEL = 1, ON_NODE_HANDLE = 2 } // enum INFLOW_SEARCH_ON 我必须使用此枚举来在网格列中进行搜索 获取我正在使用的列索引 MyEnumVariable.GetHashCode() 哪个工作正常,或者我应该使用 (short)MyEnumVariable 我对使用GetHashCode()感到有点困惑。 使用它有什么问题吗?

是否可以将私有成员的哈希码组合起来生成新的哈希码?

我有一个对象,我想生成一个唯一的哈希(覆盖GetHashCode()),但我想避免溢出或不可预测的事情。 代码应该是组合一小组字符串的哈希码的结果。 哈希码将是生成缓存密钥的一部分,因此理想情况下它们应该是唯一的,但是被散列的可能值的数量很小所以我认为概率对我有利。 这样的事情是否足够并且有更好的方法吗? int hash = 0; foreach(string item in collection){ hash += (item.GetHashCode() / collection.Count) } return hash; 编辑:感谢您的答案到目前为止。 @Jon Skeet:不,订单并不重要 我想这几乎是另一个问题,但由于我使用结果生成缓存键(字符串)是否有意义使用像MD5这样的加密哈希函数或只使用此int的字符串表示?

GetHashCode()在不同的服务器上给出不同的结果?

我声明了一个C#代码行 int hashcode = “apple”.GetHashCode(); 在我的计算机,工作中的计算机和朋友的计算机上,结果是1657858284.在开发服务器上,结果是1548091822.有没有办法让我告诉项目始终使GetHashCode()产生1657858284,无论它在哪个服务器上? 更多说明起初,我注意到版本有所不同…… 1657858284结果来自.NET 3.5和.NET 4.0。 1548091822来自.NET 2.0。 然后我告诉视觉工作室2010将项目编译为.net 2.0项目,但它仍然给了我1657858284。

应该什么时候.NET类覆盖等于()? 什么时候不应该?

VS2005文档重载等于()和操作符==(C#编程指南)的指南部分说明 不建议在非不可变类型中覆盖operator ==。 较新的.NET Framework 4文档实现等于和等式运算符(==)的指南省略了该语句,尽管社区内容中的一篇post重复了断言并引用了旧文档。 似乎至少对于一些琐碎的可变类来重写Equals()是合理的,例如 public class ImaginaryNumber { public double RealPart { get; set; } public double ImaginaryPart { get; set; } } 在数学中,具有相同实部和相同虚部的两个虚数实际上在测试相等性的时间点是相等的。 声明它们不相等是不正确的,如果具有相同RealPart和ImaginaryPart的单独对象未被覆盖Equals(),则会发生这种情况。 另一方面,如果一个覆盖Equals(),则还应覆盖GetHashCode()。 如果将覆盖Equals()和GetHashCode()的ImaginaryNumber放在HashSet中,并且可变实例更改其值,则不再在HashSet中找到该对象。 MSDN是否不正确删除有关不重写Equals()和operator==的非不可变类型的准则? 为可变类型重写Equals()是否合理,其中“在现实世界中”所有属性的等价意味着对象本身是相等的(与ImaginaryNumber )? 如果它是合理的,当对象实例参与HashSet或依赖于GetHashCode()的其他东西没有改变时,如何最好地处理潜在的可变性? UPDATE 刚刚在MSDN中遇到过这个问题 通常,当期望将类型的对象添加到某种类型的集合时,或者当它们的主要目的是存储一组字段或属性时,实现值相等。 您可以根据类型中所有字段和属性的比较来定义值相等,或者可以将定义基于子集。 但无论是哪种情况,还是在类和结构中,您的实现都应遵循等效的五个保证:

良好的GetHashCode()覆盖了尊重订单的Foo对象列表

EnumerableObject : IEnumerable 包装List 如果EnumerableObject a.SequenceEquals( EnumerableObject b) ,那么它们是相等的。 因此,必须实现GetHashCode 。 问题是XORing列表中的每个元素将返回具有所有且仅相同元素的任何列表的相同哈希码,而不管顺序如何。 就工作而言,这是好的,但会导致许多冲突,这将减慢检索速度等。 对于依赖于顺序的对象列表,什么是好的,快速的GetHashCode方法?

为什么ValueType.GetHashCode()实现得像?

来自ValueType.cs **动作:我们返回哈希码的算法有点复杂。 我们看 **为第一个非静态字段并获取它的哈希码。 如果类型没有 **非静态字段,我们返回该类型的哈希码。 我们不能接受 **静态成员的哈希码,因为如果该成员的类型与 **原始类型,我们将以无限循环结束。 今天,当我使用KeyValuePair作为字典中的键(它存储了xml属性名称(枚举)和它的值(字符串))时,我被它咬了,并期望它根据其所有字段计算它的哈希码,但根据实施情况,它只考虑了关键部分。 示例(来自Linqpad的c / p): void Main() { var kvp1 = new KeyValuePair(“foo”, “bar”); var kvp2 = new KeyValuePair(“foo”, “baz”); // true (kvp1.GetHashCode() == kvp2.GetHashCode()).Dump(); } 我猜第一个非静态字段意味着声明顺序中的第一个字段,这也可能因为任何原因在源中更改变量顺序而导致麻烦,并且认为它不会在语义上更改代码。