标签: gethashcode

为什么 Contains 返回 false,但 GetHashCode() 返回相同的数字,而 Equals 返回 true?

我有一个像这样的实体类(缺少很多东西):

class Parent
{
    private readonly Iesi.Collections.Generic.ISet<Child> children =
        new Iesi.Collections.Generic.HashedSet<Child>();

    public virtual void AddChild(Child child)
    {
        if (!this.children.Contains(child))
        {
            this.children.Add(child);
            child.Parent = this;
        }
    }

    public virtual void RemoveChild(Child child)
    {
        if (this.children.Contains(child))
        {
            child.Parent = null;
            this.children.Remove(child);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试删除子项时,该if语句的计算结果为false。因此,我在if语句上放置了一个断点,并计算了某些表达式:

this.children.Contains(child) => false
this.children.ToList()[0].Equals(child) => true
this.children.ToList()[0].GetHashCode() => 1095838920
child.GetHashCode() => 1095838920
Run Code Online (Sandbox Code Playgroud)

我的理解是,如果GetHashCode返回相同的值,则会检查Equals. 为什么Contains返回错误?


myParentChild实体都继承自一个公共Entity基类,该基类是 NHibernate 3.0 Cookbook 第 …

c# nhibernate contains equals gethashcode

5
推荐指数
1
解决办法
1143
查看次数

有没有办法减少 Equals 和 GetHashCode 中的样板代码量?

为了进行单元测试,我经常必须重写Equals和方法。GetHashCode之后我的课程开始看起来像这样:

public class TestItem
{
    public bool BoolValue { get; set; }

    public DateTime DateTimeValue { get; set; }

    public double DoubleValue { get; set; }

    public long LongValue { get; set; }

    public string StringValue { get; set; }

    public SomeEnumType EnumValue { get; set; }

    public decimal? NullableDecimal { get; set; }

    public override bool Equals(object obj)
    {
        var other = obj as TestItem;

        if (other == null)
        {
            return false;
        }

        if (object.ReferenceEquals(this, …
Run Code Online (Sandbox Code Playgroud)

c# equals gethashcode

5
推荐指数
1
解决办法
1155
查看次数

关于数据绑定集合中使用的可变对象的 overring Equals 的持续混淆

背景:

我使用 MVVM 编写了一个大型 WPF 应用程序,但它遇到了一些间歇性问题。我最初询问“已添加具有相同键的项目”从代码问题中选择 ListBoxItem 的异常,这解释了问题,但没有得到答案。

一段时间后,我设法找出了Exception我得到的原因,并将其记录在没有不可变字段的类中重写 Object.GetHashCode() 时返回什么?问题。基本上,这是因为我在公式中使用了可变字段来返回 的值GetHashCode

从我收到的针对该问题的非常有用的答案中,我设法加深了对该领域的理解。以下是三个相关规则:

  1. 如果 x 等于 y,则 x 的哈希码必须等于 y 的哈希码。同样,如果 x 的哈希码不等于 y 的哈希码,则 x 和 y 一定不相等。
  2. 当 x 在哈希表中时,x 的哈希码必须保持稳定。
  3. 哈希函数应在所有输入的所有整数之间生成随机分布。

这些规则影响了我对不知道从GetHashCode方法返回什么的问题的可能解决方案:

  • 我无法返回常量,因为这会违反上面的第一条和第三条规则。
  • 出于同样的原因,我无法readonly为每个类创建一个附加字段,而只能在该方法中使用。GetHashCode

我最终采用的解决方案是在ObservableCollection编辑方法中使用的任何属性之前从其中删除每个项目GetHashCode,然后再次重新添加它。虽然到目前为止,这在许多视图中都运行良好,但我遇到了进一步的问题,因为我的 UI 项目是使用自定义动画的Panel。当我重新添加一个项目时(即使将其插入到集合中的原始索引中),它会再次启动条目动画。

我已经添加了一些基类方法,例如AddWithoutAnimation, RemoveWithoutAnimation,这有助于解决其中一些问题,但它不会影响任何Storyboard动画,重新添加后仍然会触发动画。最后,我们来回答这个问题:

问题:

首先,我想明确声明,我没有Dictionary在代码中使用任何对象...Dictionary抛出 的对象必须ExceptionObservableCollection<T>. 我上一个问题中似乎大多数人都忽略了这一点。因此,我不能选择干脆不使用Dictionary……如果可以的话。 …

c# wpf overriding gethashcode

5
推荐指数
1
解决办法
658
查看次数

可以在类中使用GUID私有属性,以便在GetHashCode覆盖中使用它吗?

可以在类中使用GUID私有属性,以便在GetHashCode覆盖中使用它吗?

就像是:

public class Voucher : IComparable<Voucher>, IComparable, IEquatable<Voucher>
{
    private Guid? _guid;


    private Guid Guid
    {
        get
        {
            return _guid ?? (_guid = Guid.NewGuid()).GetValueOrDefault();
        }
    }
    public int Id { get; private set; }
    public string Number { get; private set; }
    public DateTime Date { get; private set; }



    public Voucher(string number, DateTime date)
    {
        Number = number;
        Date = date;
    }

    public Voucher(int id, string number, DateTime date)
        : this(number, date)
    {
        Id = id;
    }



    public …
Run Code Online (Sandbox Code Playgroud)

.net c# guid gethashcode

5
推荐指数
1
解决办法
776
查看次数

不使用 GetHashCode 的 HashSet 和 Dictionary 的 C# 高性能替代方案

我正在寻找比列表具有更好性能但不使用内部方法的HashSetDictionary对象的内置替代方案GetHashCode。我需要这个,因为我写的类,没有写的方式GetHashCode与满足通常的合同法Equals比其他

public override int GetHashCode() { return 0; } // or return any other constant value
Run Code Online (Sandbox Code Playgroud)

这将打开HashSet,并Dictionary分为普通列表(性能明智)。

所以我需要的是一个集合实现和一个映射实现。有什么建议?

编辑:

我的类是基于容差的 3 维向量类:

public class Vector
{
    private static const double TOL = 1E-10;
    private double x, y, z;

    public Vector(double x, double y, double z)
    {
        this.x = x; this.y = y; this.z = z;
    }

    public override bool Equals(object o)
    {
        Vector other = o …
Run Code Online (Sandbox Code Playgroud)

c# mapping set gethashcode

5
推荐指数
1
解决办法
935
查看次数

DateTime.Now是否有自己的GetHashCode实现,它提供了唯一的哈希值?

这里的MSDN文章指出,GetHashCode()的默认实现不保证唯一的结果,不应该用作标识符.所以我的问题是DateTime.Now是否有自己的实现可以发出独特的哈希值.谢谢你的帮助

c# datetime gethashcode

4
推荐指数
1
解决办法
7352
查看次数

如何在重写GetHashCode()的类型上使用Object.GetHashCode()

我有一个实现IEquatable <>的类A,使用它的字段(比如Ab和Ac)来实现/重写Equals()并覆盖GetHashCode(),并且99%的时候一切正常.A类是层次结构(B类,C类)的一部分,它们都从接口D继承; 它们都可以一起存储在字典中,因此当它们都带有自己的默认Equals()/ GetHashCode()时很方便.

然而,在构建AI时,有时需要做一些工作来获得Ab和Ac的值; 当发生这种情况时,我想存储对正在构建的实例的引用.在这种情况下,我不想使用A提供的默认Equals()/ GetHashCode()覆盖.因此,我正在考虑实现一个ReferenceEqualityComparer,这意味着强制使用Object的Equals()/ GetHashCode() :

    private class ReferenceEqualityComparer<T> : IEqualityComparer<T>
    {
        #region IEqualityComparer<T> Members
        public bool Equals(T x, T y)
        {
            return System.Object.ReferenceEquals(x, y);
        }

        public int GetHashCode(T obj)
        {
            // what goes here? I want to do something like System.Object.GetHashCode(obj);
        }
        #endregion
    }
Run Code Online (Sandbox Code Playgroud)

问题是,由于A重写了Object.GetHashCode(),我如何(在A之外)调用Object.GetHashCode()作为A的实例?

当然,一种方法是A不实现IEquatable <>并且始终为我创建的任何字典提供IEqualityComparer <>,但我希望得到不同的答案.

谢谢

c# iequatable iequalitycomparer gethashcode referenceequals

4
推荐指数
1
解决办法
1482
查看次数

逆向工程String.GetHashCode

String.GetHashCode的行为取决于程序架构.因此它将在x86中返回一个值,在x64上返回一个值.我有一个必须在x86中运行的测试应用程序,它必须预测必须在x64上运行的应用程序的哈希码输出.

下面是mscorwks中String.GetHashCode实现的反汇编.

public override unsafe int GetHashCode()
{
      fixed (char* text1 = ((char*) this))
      {
            char* chPtr1 = text1;
            int num1 = 0x15051505;
            int num2 = num1;
            int* numPtr1 = (int*) chPtr1;
            for (int num3 = this.Length; num3 > 0; num3 -= 4)
            {
                  num1 = (((num1 << 5) + num1) + (num1 >? 0x1b)) ^ numPtr1[0];
                  if (num3 <= 2)
                  {
                        break;
                  }
                  num2 = (((num2 << 5) + num2) + (num2 >> 0x1b)) ^ numPtr1[1];
                  numPtr1 += 2; …
Run Code Online (Sandbox Code Playgroud)

c# gethashcode

4
推荐指数
3
解决办法
2877
查看次数

如何使用覆盖的逻辑Equals()实现GetHashCode()的覆盖

我有一些类,如下所示,我已经实现了Equals(Object)几乎所有的方法.但我不知道怎么写 GetHashCode().到目前为止,我在Dictionary集合中使用这些数据类型作为值类型,我想我应该覆盖GetHashCode().

我不知道如何GetHashCode()用逻辑来实现Equals(Object).

2.有一些派生类,如果我覆盖GetHashCode()并且Equals(Object)对于基类(Param),是否仍然需要为子节点覆盖它?

class Param
{
    ...
    public Int16 id { get; set; }
    public String name { get; set; }
    ...
    public override bool  Equals(object obj)
    {
        if ( obj is Param){
            Param p = (Param)(obj);
            if (id > 0 && p.id > 0)
                return (id == p.id);
            else if (name != String.Empty && p.name != String.Empty)
                return (name.equals(p.name));
            else
                return …
Run Code Online (Sandbox Code Playgroud)

c# overriding gethashcode

4
推荐指数
2
解决办法
2万
查看次数

当两个相同类型的对象具有相同的值时,为什么哈希码不同?

据我所知,GetHashCode将为两个共享相同值的不同实例返回相同的值.在这一点上,MSDN文档有点模糊.

哈希码是一个数值,用于在相等测试期间标识对象.

如果我有两个相同类型和相同值的实例,GetHashCode()将返回相同的值?

假设所有值都相同,以下测试会过去还是失败?

SecurityUser只有getter和setter;

    [TestMethod]
    public void GetHashCode_Equal_Test()
    {
        SecurityUser objA = new SecurityUser(EmployeeName, EmployeeNumber, LastLogOnDate, Status, UserName);
        SecurityUser objB = new SecurityUser(EmployeeName, EmployeeNumber, LastLogOnDate, Status, UserName);

        int hashcodeA = objA.GetHashCode();
        int hashcodeB = objB.GetHashCode();

        Assert.AreEqual<int>(hashcodeA, hashcodeB);
    }


/// <summary>
/// This class represents a SecurityUser entity in AppSecurity.
/// </summary>
public sealed class SecurityUser
{
    #region [Constructor]

    /// <summary>
    /// Initializes a new instance of the <see cref="SecurityUser"/> class using the
    /// parameters passed.
    /// </summary>
    /// <param …
Run Code Online (Sandbox Code Playgroud)

.net c# gethashcode

4
推荐指数
1
解决办法
4441
查看次数