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

时间:2015-01-16 12:02:48

标签: c# hashtable

我的HashTables应用程序中发生了一件非常奇怪的事情。

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

所以,在这里。左边是IIS排序,右边是Visual Studio。

IIS vs VS ordering in HashTable

为什么会有所不同?考虑到.NET应该(?)使用相同的算法来存储和检索来自HashTable的数据,那么双方的排序应该是相同的,不是吗?

如果我学习它,HashTable的键被散列,那么这两个系统上的散列应该是相同的,导致散列(键)的顺序相同,因此散列表中的数据顺序相同。

我哪里错了? IIS和VS之间的HashTable实现有什么区别?

评论中的一些额外说明:

  • 项目针对.NET 4.0
  • IIS将.NET 4.0用于应用程序池
  • 我实际上将已编译的二进制文件从Visual Studios bin文件夹复制到IIS文件夹,因此它们完全相同
  • 我的假设是IIS使用与Visual Studio相同的.NET实现。如果没有:为什么?是什么让IIS上的散列与Visual Studio中的散列有很大不同?

2 个答案:

答案 0 :(得分:4)

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

  1. 哈希算法必须相同。这不仅意味着哈希函数,还意味着表的增长,收缩,处理冲突等方式。这可能就是你的情况(不同的算法)。
  2. 环境必须相同。如果哈希算法的一个参数是来自环境的东西,比如可用内存,则有意义。有些算法非常复杂,为了安全起见,试图避免页面未命中或对表进行调整。
  3. 数据必须相同,并以相同的顺序存储在哈希表中。

答案 1 :(得分:0)

正如@usr帮助我找到的,这种行为的原因在于GetHashCode()函数,它被用作HashTable个键的基础。根据密钥,HashTable上的迭代顺序将不同。

哈希函数通常应该为每个输入返回相同的哈希值,但是 ...此函数返回不同的哈希值,具体取决于配置参数,即<UseRandomizedStringHashAlgorithm>,它将返回不同的哈希,由神秘函数InternalMarvin32HashString()创建。

它是为防止 Hash Flooding DOS攻击向量而引入的。

此功能

  

[...]从外部DLL导入,确切地说就是clr.dll。

来自Martin Boßlet Dec 14th, 2012

所以我们无法真正知道,如果没有一些重大(甚至可能是非法的)重构,它会做什么。