3

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

然而,当试图查找它时,没有匹配的元素。调试表明我正在寻找的字符串与我作为键提供的字符串具有不同的哈希值。

此代码位于 Castle Monorail 项目中,使用 brail 作为视图引擎。我正在寻找的钥匙是由这样的盲文线插入的:

UrlHelper.Link(node.CurrentPage.LinkText, {@params: {@path: "/Page1"}})

然后,在此方法中(在自定义 IRoutingRule 中):

public string CreateUrl(System.Collections.IDictionary parameters)
{
    PrintDictionaryToLog(parameters);
    string url;
    if (parameters.Contains("path")) {
        url = (string)parameters["path"];
    }
    else {
        return null;
    }
}

密钥被打印到日志中,但函数返回 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");

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

4

5 回答 5

2

这是 GetHashCode for Strings 上的 MSDN 链接。如果它们相等,则哈希码应该匹配,但是如果它们不相等,它们仍然可以具有相同的哈希(尽管这种可能性可能很小)。

http://msdn.microsoft.com/en-us/library/system.string.getashcode.aspx

来自文章:

如果两个字符串对象相等,则 GetHashCode 方法返回相同的值。但是,每个唯一的字符串值都没有唯一的哈希码值。不同的字符串可以返回相同的哈希码。

于 2010-03-08T21:52:05.073 回答
1

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

于 2010-03-08T21:50:32.610 回答
1

根据StringComparison.Ordinal或更简单地等于 的字符串String.Equals在所有情况下都将具有相同的哈希码。

于 2010-03-08T21:50:54.090 回答
1

正是这一行 [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,问题就会消失。

如果这是一个单声道错误(我认为它一定是),它仍然是单声道 2.10.8.1(Debian 2.10.8.1-5ubuntu1)的问题。

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

于 2013-03-21T01:43:32.233 回答
0

您使用的是哪个版本的 Mono?这可能是 Mono 中的一个错误,如果是这样,欢迎提交错误报告。

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

于 2010-04-06T21:23:22.947 回答