gpt4 book ai didi

c# - 为什么为匿名类生成的 GetHashCode() 实现中的初始哈希值取决于属性名称?

转载 作者:太空狗 更新时间:2023-10-29 22:25:58 25 4
gpt4 key购买 nike

在为匿名类生成 GetHashCode() 实现时,Roslyn 会根据属性名称计算初始哈希值。例如,为

生成的类
var x = new { Int = 42, Text = "42" };

将具有以下 GetHashCode() 方法:

public override in GetHashCode()
{
int hash = 339055328;
hash = hash * -1521134295 + EqualityComparer<int>.Default.GetHashCode( Int );
hash = hash * -1521134295 + EqualityComparer<string>.Default.GetHashCode( Text );
return hash;
}

但是如果我们改变属性名称,初始值就会改变:

var x = new { Int2 = 42, Text2 = "42" };

public override in GetHashCode()
{
int hash = 605502342;
hash = hash * -1521134295 + EqualityComparer<int>.Default.GetHashCode( Int2 );
hash = hash * -1521134295 + EqualityComparer<string>.Default.GetHashCode( Text2 );
return hash;
}

这种行为背后的原因是什么?只选择一个大的 [prime?] 数字并将其用于所有匿名类是否有问题?

最佳答案

Is there some problem with just picking a big [prime?] number and using it for all the anonymous classes?

这样做并没有错,只是往往会产生效率较低的值。

GetHashCode 的目标实现是为不相等的值返回不同的结果。这减少了在基于哈希的集合(例如 Dictionary<TKey, TValue> )中使用值时发生冲突的机会。

如果匿名值表示不同的类型,则它们永远不能等于另一个匿名值。匿名值的类型由属性的形状定义:

  • 属性名称
  • 属性类型
  • 属性数

两个在任何这些特征上不同的匿名值代表不同的类型,因此永远不可能是相等的值。

如果这是真的,编译器生成 GetHashCode 是有意义的倾向于为不同类型返回不同值的实现。这就是为什么 the compiler在计算初始散列时包括属性名称。

关于c# - 为什么为匿名类生成的 GetHashCode() 实现中的初始哈希值取决于属性名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32808566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com