.NET哈希表-“;“相同”;键,不同的散列

.NET哈希表-“;“相同”;键,不同的散列,.net,mono,hashtable,castle-monorail,brail,.net,Mono,Hashtable,Castle Monorail,Brail,两个.net字符串是否可能有不同的哈希值?我有一个哈希表,其中包括键“path”。当我循环表中的元素以打印它时,我可以看到键存在 但是,当尝试查找时,没有匹配的元素。调试表明,我要查找的字符串的哈希值与我提供的作为键的哈希值不同 此代码位于Castle Monorail项目中,使用brail作为视图引擎。我要找的钥匙是由一条brail线插入的,如下所示: UrlHelper.Link(node.CurrentPage.LinkText, {@params: {@path: "/Page1"}})

两个.net字符串是否可能有不同的哈希值?我有一个哈希表,其中包括键“path”。当我循环表中的元素以打印它时,我可以看到键存在

但是,当尝试查找时,没有匹配的元素。调试表明,我要查找的字符串的哈希值与我提供的作为键的哈希值不同

此代码位于Castle Monorail项目中,使用brail作为视图引擎。我要找的钥匙是由一条brail线插入的,如下所示:

UrlHelper.Link(node.CurrentPage.LinkText, {@params: {@path: "/Page1"}})
然后,在此方法中(在自定义IRoutingRule中):

密钥将打印到日志中,但函数返回null。我甚至不知道这可能是.net字符串的问题,但我猜这是某种编码问题

哦,这是单声道

根据要求,以下是日志中的相关行:

2010-03-08 22:58:00,504 [7] DEBUG Knickle.Framework.Routing.PageRoute (null) - Parameters: {System.String controller=null, System.String path=Page1, System.String path=/Page1, System.String action=null, System.String area=null}
此外,我在日志打印调用上方添加了一行代码:

parameters.Add("path", "Page1");

查看日志,您会注意到有两个“path”键。调试器在表中的不同位置显示两个键。

不应该发生。检查尾随空格、URL转义等。

根据
StringComparison.Ordinal
或更简单的
String.Equals在所有情况下都具有相同的哈希代码

这里是字符串的GetHashCode上的MSDN链接。如果它们相等,哈希代码应该匹配,但是如果它们不相等,它们仍然可以具有相同的哈希(无论这种可能性多么小)

从文章中:

如果两个字符串对象相等,则 GetHashCode方法返回相同的 价值观然而,这并不是一个独特的概念 每个唯一字符串的哈希代码值 价值可以返回不同的字符串 相同的哈希代码


你使用的是哪个版本的Mono?这可能是Mono中的一个bug,如果是这样的话,欢迎发布bug报告


但是,是的,我同意Seva的观点,原因可能是一些尾随空格或分隔符或其他编码问题导致字符串以某种微妙的方式不同,并导致不同的散列。

正是这一行实现了这一点[Castle.MonoRail.Framework.Services.DefaultUrlBuilder:397]

// Forces copying entries to a non readonly dictionary, preserving the original one
parameters = new Hashtable(parameters, StringComparer.InvariantCultureIgnoreCase);
如果卸下IEqualityComparer,问题将消失

如果这是一个mono bug(我认为一定是),那么mono 2.10.8.1(Debian 2.10.8.1-5ubuntu1)仍然存在问题


测试用例需要编写和归档。

嘿,我从来没有注意到这个答案。我不再记得这个问题出现在哪个项目中。因为这是一个玩具项目,我一直在继续,但我从来没有解决过这个问题。不过挖得不错。
// Forces copying entries to a non readonly dictionary, preserving the original one
parameters = new Hashtable(parameters, StringComparer.InvariantCultureIgnoreCase);