为什么 HashTable 顺序在 Visual Studio 调试中与 IIS 不同

Why are HashTable order different in Visual Studio Debugging compared to IIS

在我的哈希表应用程序中发生了一件非常奇怪的事情。

首先:是的,我知道 HashTables 不应该按照插入的方式或任何其他方式(但键的哈希值)进行排序。那没有回答我的问题。我不需要订购它,我只是想知道为什么两个看似相同的系统之间存在差异。

所以,就在这里。左侧是 IIS 排序,右侧是 Visual Studio.

为什么不一样?考虑到 .NET 应该(?)使用相同的算法来存储和检索 HashTable 中的数据,两边的顺序应该相同,不是吗?

如果,正如我所了解的那样,哈希表的键是散列的,那么这个散列在两个系统上应该是相同的,导致相同的散列(键)顺序,因此数据在表中的顺序相同哈希表。

我哪里错了? IIS和VS在HashTable实现上有什么区别?

来自评论的一些额外说明:

为了使 table 中的项目具有相同的顺序,必须满足几个条件:

  1. 哈希算法必须相同。这不仅意味着散列函数,还意味着 table 增长、收缩、处理冲突等的方式。这可能是你的情况的原因(不同的算法)。
  2. 环境必须相同。如果哈希算法的参数之一是来自环境的东西,比如可用内存,这是有意义的。一些算法非常复杂,试图避免页面丢失或出于安全目的添加 table。
  3. 数据必须相同,并且以相同顺序存储在散列table中。

正如@usr 帮助我发现的那样,这种行为的原因在于 GetHashCode() 函数,它用作 HashTables 键的基础。根据密钥的不同,HashTable 上的迭代顺序会有所不同。

散列函数通常 return 每个输入的散列值相同,但是...这个函数 returns 不同的散列值,取决于配置参数,即<UseRandomizedStringHashAlgorithm> which will return a different hash, created by a mysterious function InternalMarvin32HashString().

引入它是为了防止 哈希泛洪 DOS 攻击向量。

不过这个功能

[...] is imported from an external DLL, clr.dll to be precise.

来自 Martin Boßlet Dec 14th, 2012

所以我们无法真正知道,如果不进行一些重大的(甚至可能是非法的)重构,它到底做了什么。