按照MSDN中对 GetHashCode()函数的说明:如果两个类型相同的对象表示相同的值,则哈希函数必须为两个对象返回相同的常数值。
为了获得最佳性能,哈希函数必须为所有输入生成随机分布。
不论对该对象进行什么样的更改,哈希函数都必须返回完全相同的值。
但我的类Font的两个实例f1和f2 GetHashCode()的结果确不一样为什么,代码如下: enum Color { Red, Blue } class Font //: Object//(12bytes+8bytes=20bytes)*n
{
string fontName;//4bytes
int size;//4bytes
Color color;//4bytes public Font(string FontName, int Size,Color PColor)
{
fontName = FontName;
size = Size;
color = PColor;
}
} class Program
{
static void Main(string[] args)
{
Font f1 = new Font("宋体", 5, Color.Red);
Font f2 = new Font("宋体", 5, Color.Red); int b1=f1.GetHashCode();
int b2=f2.GetHashCode();
}
}
为了获得最佳性能,哈希函数必须为所有输入生成随机分布。
不论对该对象进行什么样的更改,哈希函数都必须返回完全相同的值。
但我的类Font的两个实例f1和f2 GetHashCode()的结果确不一样为什么,代码如下: enum Color { Red, Blue } class Font //: Object//(12bytes+8bytes=20bytes)*n
{
string fontName;//4bytes
int size;//4bytes
Color color;//4bytes public Font(string FontName, int Size,Color PColor)
{
fontName = FontName;
size = Size;
color = PColor;
}
} class Program
{
static void Main(string[] args)
{
Font f1 = new Font("宋体", 5, Color.Red);
Font f2 = new Font("宋体", 5, Color.Red); int b1=f1.GetHashCode();
int b2=f2.GetHashCode();
}
}
上头的说明只对值类型有效...把代码换成这个试试
int f1 = 1; int f2 = 1;
int b1=f1.GetHashCode();
int b2=f2.GetHashCode();
AssertIf(object1 == object2, object1.GetHashCode() == object2.GetHashCode());HashCode在两个对象相等的时候应给得到同样的HashCode,当两个对象不等时一般都会返回不同的HashCode楼主new出来的两个Font对象是不相等的,当然会得到不同的hash
一楼的例子可以说明
楼主new出来的两个Font对象是不相等的,当然会得到不同的hash
一楼的例子可以说明
实际不等的是保存对象的内存地址..
如果LZ希望得到相等的GetHashCode()可以重写这个方法..
简单有效的可以这样写..return (fontName.ToString()+size.ToString()+color.ToString()).GetHashCode();
三楼这个办法我用了,但也有可能正好碰到不同的值加起来一样(虽然概率非常小)。
想再问个问题,就是有没有更严密的办法判断f1 f2 两个对象是相等的