Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net core 为什么对F#记录进行散列处理会在每次运行时返回不同的值_.net Core_F#_Record_Deterministic - Fatal编程技术网

.net core 为什么对F#记录进行散列处理会在每次运行时返回不同的值

.net core 为什么对F#记录进行散列处理会在每次运行时返回不同的值,.net-core,f#,record,deterministic,.net Core,F#,Record,Deterministic,我试图创建一个简单的磁盘缓存,但每次运行应用程序时,结构相同的记录都有不同的哈希值 当我在LINQPad中运行它或者记录只包含一个整数时,该行为似乎是正确的(确定性的) Exe netcoreapp2.2 type Test={Test:string} [] 让主argv= {test=“test”} |>散列 |>printfn“%i” 0 我希望在结构相同的记录上运行hash总是返回相同的值。F#underneat使用标准的.NET哈希函数。每次执行新进程(或旧.NET框架中的AppD

我试图创建一个简单的磁盘缓存,但每次运行应用程序时,结构相同的记录都有不同的哈希值

当我在LINQPad中运行它或者记录只包含一个整数时,该行为似乎是正确的(确定性的)


Exe
netcoreapp2.2
type Test={Test:string}
[]
让主argv=
{test=“test”}
|>散列
|>printfn“%i”
0
我希望在结构相同的记录上运行
hash
总是返回相同的值。

F#underneat使用标准的.NET哈希函数。每次执行新进程(或旧.NET框架中的AppDomain)时,都会应用一个特殊的随机种子。这使得它们在不同的过程中不一致。其原因是安全性:保持哈希不变将是一个漏洞,可用于确定性哈希冲突攻击等

如果你想要快速一致的散列,你需要像Murruil3或CityHash这样的东西。它们在散列任何字节序列方面都非常快,并且提供了相当好的冲突避免。但是,在F#/.NET中,它们不受开箱即用的支持


如果您想使用.NET标准库中已经存在的东西,您可能会使用MD5,但请记住,它的速度比上面两种要慢得多。它也被认为更容易发生冲突。

我认为这是一个.Net核心的东西,而不是F#的东西:你永远不应该依赖
GetHashCode
来确定,对编译器或运行时的更改总是有可能更改它,这会破坏你的代码-现在.Net核心有这样一个:)。它有特定的用途(在上面的链接中提到),不适合作为缓存密钥。如果你需要类似的东西,可以考虑用你的记录中的字段SHAL或者类似的方法自己滚动。