为什么 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实现上有什么区别?
来自评论的一些额外说明:
- 项目针对 .NET 4.0
- IIS 将 .NET 4.0 用于应用程序池
- 我实际上是从Visual Studios
bin
文件夹中复制编译好的二进制文件到IIS文件夹中,所以它们是完全一样的
- 我的假设是 IIS 使用与 Visual Studio 相同的 .NET 实现。如果不是:为什么?是什么使 IIS 上的散列与 Visual Studio 中的散列如此不同?
为了使 table 中的项目具有相同的顺序,必须满足几个条件:
- 哈希算法必须相同。这不仅意味着散列函数,还意味着 table 增长、收缩、处理冲突等的方式。这可能是你的情况的原因(不同的算法)。
- 环境必须相同。如果哈希算法的参数之一是来自环境的东西,比如可用内存,这是有意义的。一些算法非常复杂,试图避免页面丢失或出于安全目的添加 table。
- 数据必须相同,并且以相同顺序存储在散列table中。
正如@usr 帮助我发现的那样,这种行为的原因在于 GetHashCode() 函数,它用作 HashTable
s 键的基础。根据密钥的不同,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
所以我们无法真正知道,如果不进行一些重大的(甚至可能是非法的)重构,它到底做了什么。
在我的哈希表应用程序中发生了一件非常奇怪的事情。
首先:是的,我知道 HashTables 不应该按照插入的方式或任何其他方式(但键的哈希值)进行排序。那没有回答我的问题。我不需要订购它,我只是想知道为什么两个看似相同的系统之间存在差异。
所以,就在这里。左侧是 IIS 排序,右侧是 Visual Studio.
为什么不一样?考虑到 .NET 应该(?)使用相同的算法来存储和检索 HashTable 中的数据,两边的顺序应该相同,不是吗?
如果,正如我所了解的那样,哈希表的键是散列的,那么这个散列在两个系统上应该是相同的,导致相同的散列(键)顺序,因此数据在表中的顺序相同哈希表。
我哪里错了? IIS和VS在HashTable实现上有什么区别?
来自评论的一些额外说明:
- 项目针对 .NET 4.0
- IIS 将 .NET 4.0 用于应用程序池
- 我实际上是从Visual Studios
bin
文件夹中复制编译好的二进制文件到IIS文件夹中,所以它们是完全一样的 - 我的假设是 IIS 使用与 Visual Studio 相同的 .NET 实现。如果不是:为什么?是什么使 IIS 上的散列与 Visual Studio 中的散列如此不同?
为了使 table 中的项目具有相同的顺序,必须满足几个条件:
- 哈希算法必须相同。这不仅意味着散列函数,还意味着 table 增长、收缩、处理冲突等的方式。这可能是你的情况的原因(不同的算法)。
- 环境必须相同。如果哈希算法的参数之一是来自环境的东西,比如可用内存,这是有意义的。一些算法非常复杂,试图避免页面丢失或出于安全目的添加 table。
- 数据必须相同,并且以相同顺序存储在散列table中。
正如@usr 帮助我发现的那样,这种行为的原因在于 GetHashCode() 函数,它用作 HashTable
s 键的基础。根据密钥的不同,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
所以我们无法真正知道,如果不进行一些重大的(甚至可能是非法的)重构,它到底做了什么。