【发布时间】:2015-01-16 12:02:47
【问题描述】:
在我的 HashTables 应用程序中发生了一件非常奇怪的事情。
首先:是的,我知道 HashTables 不应该以插入的方式或任何其他方式(但键的哈希值)排序。那没有回答我的问题。我不需要订购它,我只是想知道为什么它在两个看似相同的系统之间有所不同。
所以,就是这样。左边是IIS排序,右边是Visual Studio。
为什么不一样?考虑到 .NET 应该(?)使用相同的算法来存储和检索来自 HashTable 的数据,所以两边的顺序应该是相同的,不是吗?
如果,据我所知,HashTable 的键是散列的,那么这个散列在两个系统上应该是相同的,从而产生相同的散列(键)顺序,因此哈希表中的数据顺序相同。
我哪里错了? IIS和VS的HashTable实现有什么区别?
来自 cmets 的一些额外说明:
- 项目面向 .NET 4.0
- IIS 使用 .NET 4.0 作为应用程序池
- 其实我把编译好的二进制文件从Visual Studios的
bin文件夹复制到了IIS文件夹,所以完全一样 - 我的假设是 IIS 使用与 Visual Studio 相同的 .NET 实现。如果不是:为什么?是什么让 IIS 上的散列与 Visual Studio 中的散列如此不同?
【问题讨论】:
-
“顺序应该相同”取决于实现,因此框架。这还取决于您是否已经删除了项目。
-
他们最近添加了一个功能来打乱哈希码,这样攻击者就不能轻易地强迫大量的哈希冲突导致 DOS 情况。在 BCL 中搜索名为“MarvinsHashCode”之类的内部方法...
-
@FlorianPeschka 它是 InternalMarvin32HashString 和 UseRandomizedStringHashAlgorithm 配置元素。这就是我所知道的。
-
@FlorianPeschka 我怀疑在非托管代码中获取配置是有原因的。通常,字符串类只能从 app.config 读取配置,但它不能。一定是有原因的。一定有一些更进一步的逻辑,可能取决于 CLR 主机。
-
@FlorianPeschka github.com/floodyberry/Marvin32/blob/master/Marvin32.c 这就是算法。但是,这并不能回答种子的来源以及使用算法的原因。