标签: gethashcode


覆盖一个类型的Equals和GetHashCode,它有'dibs'?

这个问题和Jon的回答让我意识到这甚至存在,所以我很好奇并启动了Visual Studio.


我按照MSDN页面的一个示例,然后创建了我自己的小例子.它如下:

public class Person : IEquatable<Person>
{
    public string IdNumber { get; set; }
    public string Name { get; set; }

    public bool Equals(Person otherPerson)
    {
        if (IdNumber == otherPerson.IdNumber)
            return true;
        else
            return false;
    }

    public override bool Equals(object obj)
    {
        if (obj == null) 
            return base.Equals(obj);

        if (!(obj is Person))
            throw new InvalidCastException("The Object isn't of Type Person.");
        else
            return Equals(obj as Person);
    }

    public override int GetHashCode()
    {
        return IdNumber.GetHashCode();
    }

    public static bool …
Run Code Online (Sandbox Code Playgroud)

.net c# equals gethashcode

2
推荐指数
1
解决办法
2262
查看次数

使用一个字段在类中覆盖Equals和GetHashCode

我有一节课:

public abstract class AbstractDictionaryObject
    {
        public virtual int LangId { get; set; }

        public override bool Equals(object obj)
        {
            if (obj == null || obj.GetType() != GetType())
            {
                return false;
            }

            AbstractDictionaryObject other = (AbstractDictionaryObject)obj;
            if (other.LangId != LangId)
            {
                return false;
            }

            return true;
        }

        public override int GetHashCode()
        {
            int hashCode = 0;               
            hashCode = 19 * hashCode + LangId.GetHashCode();
            return hashCode;
        }
Run Code Online (Sandbox Code Playgroud)

我派出了类:

public class Derived1:AbstractDictionaryObject
{...}

public class Derived2:AbstractDictionaryObject
{...}
Run Code Online (Sandbox Code Playgroud)

在这AbstractDictionaryObject只是一个共同的领域:LangId. …

c# overriding equals gethashcode

2
推荐指数
1
解决办法
1670
查看次数

C#:覆盖GetHashCode,这段代码有什么作用?

这是我在Nhibernate 3 Beginners Guide覆盖中找到的代码GetHashCode.我不明白为什么它使用结果*397.如果397只是一个随机数他用来产生独特的结果?

我们可以只GetHashCode使用firstname,middlename和lastname,然后使用^将它们组合在一起,它还应该生成一个唯一的结果.

public override int GetHashCode()
{
   unchecked
   {
       var result = FirstName.GetHashCode();
       result = (result*397) ^ (MiddleName != null ? MiddleName.GetHashCode() : 0);
       result = (result*397) ^ LastName.GetHashCode();
       return result;
   }
}
Run Code Online (Sandbox Code Playgroud)

c# nhibernate gethashcode

2
推荐指数
1
解决办法
1318
查看次数

将Object.GetHashCode()转换为Guid

我需要为应用程序启动和关闭时管理状态的对象分配一个guid看起来我可以使用字典将查找值存储在字典中

dictionary<int,Guid>.Add(instance.GetHashCode(), myGUID());
Run Code Online (Sandbox Code Playgroud)

这里有什么潜在的问题需要注意吗?

注意

这不需要在执行运行之间持续存在,只需要像这样的guid

  • 创建对象
  • gethashcode(),与新的或旧的guid相关联
  • 在应用程序终止之前,gethashcode()和查找guid以更新()或插入()到持久性引擎USING GUID

    唯一的假设是gethashcode()在进程运行时保持一致

    在相同的对象类型(从窗口派生)上调用gethashcode()

更新2 - 这是更大的图片

  • 创建一个状态机,以便在运行之间存储有关WPF用户控件(后来引用为UC)的信息
  • 用户控件的类型可以随时间变化(添加/删除)
  • 在第一次运行中,没有先前状态,用户与U​​C的子集交互并修改其状态,需要在应用重启时重新创建
  • 当应用程序正常关闭时,将拍摄此状态快照
  • 也可以有多种UC类型的实例
  • 在关机时,每个实例都会分配一个guid,并与类型信息和状态信息一起保存
  • 所有这些guid也存储在一个集合中
  • 在重新启动时,为每个guid,创建对象,存储ref/guid,恢复每个实例的状态,以便应用程序看起来与以前完全一样
  • 用户可以添加或删除UC实例/类型,否则与系统交互
  • 在关机时,状态再次被保存
  • 此时的选择是删除/删除所有先前状态并将新状态信息插入持久层(sql db)
  • 随着时间的观察/分析,事实证明很多实例保持一致/静态并且不会改变 - 所以它们的状态不需要再次删除/插入,因为状态信息现在非常大并且存储在非本地数据库上
  • 所以只保留更改增量
  • 要计算增量,需要跟踪参考生命周期
  • 目前存储List<WeakReference>在启动时
  • 在关机时,遍历此列表并在屏幕上显示实际UC,相应地添加/更新/删除密钥
  • 将delta发送到持久性

希望上面说清楚.

所以现在的问题是 - 为什么不只是存储HashCode(仅用户控件)而不是WeakReference在通过列表迭代时消除空引用的测试

更新3 - 谢谢所有,最后将使用弱引用

.net c# gethashcode base-class-library

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

随机数与CompreTo()中的GetHashCode()?

我在我的结构中使用Random类CompareTo()以相同的概率选择其中一个结构,当它们具有相同的字段值时.使用固定种子实例化Random类以获得可重现的伪随机值序列,以确保无论我使用相同输入运行多少次,我的程序都会给出相同的精确比较结果.

我正在考虑用内存引用或GetHashCode()替换随机数.这样做可以保证:

(1)选择是以相同的概率进行的,并且

(2)如果再次运行程序,我会得到相同的结果吗?

struct MyStruct : IComparable<MyStruct>
{
        private readonly float _param1;
        private readonly float _param2;
        private readonly int _randValue;

        public MyStruct(float param1, float param2)
        {
                _param1 = param1;
                _param2 = param2;
                _randValue = _random.Next();
        }

        public int CompareTo(MyStruct other)
        {
            if (_param1 < other._param1)
            {
                return -1;
            }
            else if (_param1 > other._param1)
            {
                return 1;
            }
            else if (_param2 > other._param2)
            {
                return -1;
            }
            else if (_param2 < other._param2)
            {
                return 1;
            }
            // …
Run Code Online (Sandbox Code Playgroud)

c# random compareto gethashcode

2
推荐指数
1
解决办法
879
查看次数

是long.GetHashCode可靠的交叉环境

long.GetHashCode()在不同的.NET Framework版本,操作系统版本,处理器架构等中,出现的值是否可靠?

该问题基于在不同服务器上提到不同结果的其他问题.

// Will I be the same everywhere?
var hash = 2170881568869167279.GetHashCode();
Run Code Online (Sandbox Code Playgroud)

奖励:是否同去intuint

.net gethashcode

2
推荐指数
1
解决办法
435
查看次数

C#对象的32位散列函数

我希望在所有类中覆盖对象的GetHashCode()方法.此方法返回Int32.我知道所有加密哈希函数的返回值都不适合32位整数.我想尽可能避免碰撞.我应该截断像SHA一样的安全散列,还是使用32位散列?如果使用32位散列,那么最好的32位散列是什么?

c# hash gethashcode

2
推荐指数
1
解决办法
3276
查看次数

LINQ - 区别被忽略了吗?

所以我的LINQ代码有问题,我必须选择一个不同的数据集,我实现了以下内容IEqualityComparer:

public class ProjectRoleComparer : IEqualityComparer<ProjectUserRoleMap>
{
    public bool Equals(ProjectUserRoleMap x, ProjectUserRoleMap y)
    {
        return x.RoleID.Equals(y.RoleID);
    }
    public int GetHashCode(ProjectUserRoleMap obj)
    {
        return obj.GetHashCode();
    }
}
Run Code Online (Sandbox Code Playgroud)

在这个上下文中,我希望检索一组ProjectUserRoleMap与给定项目相关的对象,由它的ID标识,我只想要一个ProjectUserRoleMap唯一的RoleID,但是我的严格指令对它执行不同的选择RoleID被忽略.我完全不知道为什么会这样,并且不了解LINQ足以想到一个解决方法.这是调用代码:

ProjectRoleComparer prCom = new ProjectRoleComparer();

IEnumerable<ProjectUserRoleMap> roleList = ProjectData.AllProjectUserRoleMap.Where(x => x.ProjectID == id).Distinct(prCom);
Run Code Online (Sandbox Code Playgroud)

这个代码给了我6个条目,当我知道我想要的条目数是4 时.我对LINQ的使用做错了吗?

作为参考,该ProjectUserRoleMap对象具有RoleID,(int)

.net c# linq distinct gethashcode

2
推荐指数
1
解决办法
259
查看次数

覆盖Equals和GetHashCode - 派生类中的默认实现

我对C#中Equals和GetHashCode的默认行为有点困惑.假设我有两个类,一个派生自另一个:

public abstract class Question
    {
        public string QuestionText
        {
            get;
            set;
        }

        public override bool Equals(object obj)
        {
            if (obj is Question)
            {
                Question q = (Question)obj;
                return this.QuestionText.Equals(q.QuestionText);
            }
            else
            {
                return false;
            }
        }

        public override int GetHashCode()
        {
            int hash = 13; 
            hash = (hash * 7) + this.QuestionText.GetHashCode(); 
            return hash; 
        }
 }

public class QuestionTrueFalse : Question
    {
        public bool CorrectAnswer
        {
            get;
            set;
        }

        public override bool Equals(object obj)
        {
            return base.Equals(q);
        }

        public …
Run Code Online (Sandbox Code Playgroud)

c# inheritance equals gethashcode

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