c#是否与Java with equals和gethashcode有相同的问题?
问题如:http://onjava.com/pub/a/onjava/2006/09/13/dont-let-hibernate-steal-your-identity.html
这个问题和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) 我有一节课:
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. …
这是我在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) 我需要为应用程序启动和关闭时管理状态的对象分配一个guid看起来我可以使用字典将查找值存储在字典中
dictionary<int,Guid>.Add(instance.GetHashCode(), myGUID());
Run Code Online (Sandbox Code Playgroud)
这里有什么潜在的问题需要注意吗?
这不需要在执行运行之间持续存在,只需要像这样的guid
在应用程序终止之前,gethashcode()和查找guid以更新()或插入()到持久性引擎USING GUID
唯一的假设是gethashcode()在进程运行时保持一致
在相同的对象类型(从窗口派生)上调用gethashcode()
List<WeakReference>在启动时希望上面说清楚.
所以现在的问题是 - 为什么不只是存储HashCode(仅用户控件)而不是WeakReference在通过列表迭代时消除空引用的测试
更新3 - 谢谢所有,最后将使用弱引用
我在我的结构中使用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) long.GetHashCode()在不同的.NET Framework版本,操作系统版本,处理器架构等中,出现的值是否可靠?
该问题基于在不同服务器上提到不同结果的其他问题.
// Will I be the same everywhere?
var hash = 2170881568869167279.GetHashCode();
Run Code Online (Sandbox Code Playgroud)
奖励:是否同去int和uint?
我希望在所有类中覆盖对象的GetHashCode()方法.此方法返回Int32.我知道所有加密哈希函数的返回值都不适合32位整数.我想尽可能避免碰撞.我应该截断像SHA一样的安全散列,还是使用32位散列?如果使用32位散列,那么最好的32位散列是什么?
所以我的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)
我对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) gethashcode ×10
c# ×9
.net ×4
equals ×4
compareto ×1
distinct ×1
hash ×1
inheritance ×1
java ×1
linq ×1
nhibernate ×1
overriding ×1
random ×1