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的话。这就是我要做的,才能得到那个编码你能提供这个声明的来源吗?