3

2つの.net文字列が異なるハッシュを持つことは可能ですか?私は、とりわけ重要な「パス」を備えたハッシュテーブルを持っています。テーブル内の要素をループして印刷すると、キーが存在することがわかります。

ただし、検索しようとすると、一致する要素がありません。デバッグは、私が探している文字列が、キーとして提供しているものとは異なるハッシュを持っていることを示唆しています。

このコードは、ビューエンジンとして点字を使用するCastleMonorailプロジェクトに含まれています。私が探しているキーは、次のようなブレイルラインによって挿入されます。

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");

ログを見ると、2つの「パス」キーがあることがわかります。デバッガーは、テーブルのさまざまな場所に両方のキーを表示します。

4

5 に答える 5

2

GetHashCode for Strings の MSDN へのリンクは次のとおりです。それらが等しい場合、ハッシュコードは一致するはずですが、等しくない場合でも、同じハッシュを持つ可能性があります (その可能性がどれほど小さいとしても)。

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

記事から:

2 つの文字列オブジェクトが等しい場合、GetHashCode メソッドは同じ値を返します。ただし、一意の文字列値ごとに一意のハッシュ コード値はありません。異なる文字列が同じハッシュ コードを返す場合があります。

于 2010-03-08T21:52:05.073 に答える
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 に答える
1

起こるべきではありません。末尾のスペース、URL エスケープなどを確認します。

于 2010-03-08T21:50:32.610 に答える
1

StringComparison.Ordinal、またはより単純に に従って等しい文字列はString.Equals、すべての状況で同じハッシュ コードを持ちます。

于 2010-03-08T21:50:54.090 に答える
0

どのバージョンの Mono を使用していましたか? Mono のバグである可能性があります。その場合、バグ レポートを歓迎します。

しかし、ええ、おそらく原因は末尾のスペースやセパレーター、または文字列が微妙に異なり、異なるハッシュになるその他のエンコードの問題であることに同意します。

于 2010-04-06T21:23:22.947 に答える