相同的 GUID 可以产生不同的哈希码吗?
Can same GUID produce different hash codes?
给定相同的 GUID Object.GetHashCode
生成不同的哈希码,但 Object.Equals
显示相同的 GUID 等于。
整个 GUID:
不同的哈希码:
等于==
true
:
而且,显然,两者都是 System.Guid
:
即使是相同的 GUID,它们也是不同的值,因为它们是从两个来源反序列化的。
这是预期的行为吗?
您的测试不正确。在比较 .GetType().FullName
的最后部分,您正在查看 .Id
,但 不是 您在上面比较的内容。
所以:问题出在具有 .Id
的类型,tags
和 existingTags
中的东西。看看Equals
和GetHashCode
那.
屏幕截图不显示监视变量的类型,仅显示值。该值由 DebuggerDisplay 属性控制。
我敢打赌这些列表包含一个 Tag
class 和一个显示 GUID 的 DebuggerDisplay
属性,可能是最后一个屏幕截图中出现的 ID,例如:
[DebuggerDisplay("{ID}"]
public class Tag
{
public Guid ID{get;set;}
//...
}
Watchwindow会在Value
列显示ID
属性的内容,在Type
列显示Tag
的实际类型=]列。
Tag的ID
可能相同,但内容可能不同,导致哈希码不同。等于可能只是因为它不使用与 GetHashCode()
相同的字段
给定相同的 GUID Object.GetHashCode
生成不同的哈希码,但 Object.Equals
显示相同的 GUID 等于。
整个 GUID:
不同的哈希码:
等于==
true
:
而且,显然,两者都是 System.Guid
:
即使是相同的 GUID,它们也是不同的值,因为它们是从两个来源反序列化的。
这是预期的行为吗?
您的测试不正确。在比较 .GetType().FullName
的最后部分,您正在查看 .Id
,但 不是 您在上面比较的内容。
所以:问题出在具有 .Id
的类型,tags
和 existingTags
中的东西。看看Equals
和GetHashCode
那.
屏幕截图不显示监视变量的类型,仅显示值。该值由 DebuggerDisplay 属性控制。
我敢打赌这些列表包含一个 Tag
class 和一个显示 GUID 的 DebuggerDisplay
属性,可能是最后一个屏幕截图中出现的 ID,例如:
[DebuggerDisplay("{ID}"]
public class Tag
{
public Guid ID{get;set;}
//...
}
Watchwindow会在Value
列显示ID
属性的内容,在Type
列显示Tag
的实际类型=]列。
Tag的ID
可能相同,但内容可能不同,导致哈希码不同。等于可能只是因为它不使用与 GetHashCode()
相同的字段