F记录的GetHashCode()是如何实现的?
我正在努力找到它F记录的GetHashCode()是如何实现的?,hash,f#,record,hashcode,Hash,F#,Record,Hashcode,我正在努力找到它 这非常重要,因为我需要确保尽可能少的碰撞。我可以告诉你,它不会提供尽可能少的碰撞。您可能希望覆盖GetHashCode。一些人抱怨它不适合他们的散列需求,但是为了向后兼容,它不能被合理地更改。如果出于检查冲突散列的性能考虑,这对您来说是一个严重问题,那么我会在github visual fsharp存储库中添加一个问题 最新情况,资料来源: 正如Voronipoto提到的,您可能希望自己重写GetHashCode,但是GetHashCode的默认实现对于记录的工作方式如下所示。
这非常重要,因为我需要确保尽可能少的碰撞。我可以告诉你,它不会提供尽可能少的碰撞。您可能希望覆盖GetHashCode。一些人抱怨它不适合他们的散列需求,但是为了向后兼容,它不能被合理地更改。如果出于检查冲突散列的性能考虑,这对您来说是一个严重问题,那么我会在github visual fsharp存储库中添加一个问题 最新情况,资料来源:
正如Voronipoto提到的,您可能希望自己重写GetHashCode,但是GetHashCode的默认实现对于记录的工作方式如下所示。假设字段是记录中字段值的列表,则执行以下步骤: 从初始值0开始 然后,对于字段中的每个元素,从定义的最后一个元素开始,即给定记录类型{a:int;b:string},我们从b开始,执行以下操作: 0x9e3779b9+字段。[i]。GetHashCode+值>2,其中值是来自算法上一次迭代的值。我们假设字段[i]不为null,否则其哈希值仅设置为0 对所有字段重复步骤2 您可以在和的源代码中看到这一点 对于{a:int;b:string}的简单示例记录,反编译的GetHashCode方法如下:
[CompilerGenerated]
public sealed override int GetHashCode(IEqualityComparer comp)
{
if (this != null)
{
int num = 0;
num = -1640531527 + ((b@?.GetHashCode() ?? 0) + ((num << 6) + (num >> 2)));
return -1640531527 + (a@ + ((num << 6) + (num >> 2)));
}
return 0;
}
您可以使用反编译器或将光标放在方法或记录上,然后点击F12。编译器为每种记录类型生成该方法和Equals。@PanagiotisKanavos好的,很高兴知道。您能提供一个典型记录的示例生成代码,其中包含一些不同类型的属性吗?您可以通过反编译器查看代码,如果不点击记录上的F12的话。这就是我要做的,才能得到那个编码你能提供这个声明的来源吗?