2

名前文字列とその SHA1 値をデータベースに渡しています。SHA 値は、検索のインデックスとして使用されます。実装が完了した後、名前の大文字と小文字を区別しないようにするという要件がありました。すべての言語を考慮する必要があります (漢字は実際の使用例です)。

私はトルコのテストについて知っています。ハッシュする前に入力文字列を変換して大文字と小文字を区別しないようにするにはどうすればよいですか? 理想的には、 InvariantCultureIgnoreCaseと同等にしたいと思います。

つまり、この関数の出力で大文字と小文字を区別しないようにするにはどうすればよいでしょうか?

private byte[] ComputeHash(string s)
{
     byte[] data = System.Text.Encoding.Unicode.GetBytes(s ?? string.Empty);
     SHA1 sha = new SHA1CryptoServiceProvider();     // returns 160 bit value
     return sha.ComputeHash(data);
}

SHA が不可能な場合は、String.GetHashCode () を機能させることができるかもしれませんが、大文字と小文字を区別しないようにする方法もわかりません。

私はこれが不可能だと確信しています。そうでない場合、回避策は何ですか?

4

3 に答える 3

7

ToLower(Invariant) の使用を提案する既存の回答は間違っています。ToLower を実行した後に文字列を比較することは、string.Compare(xxxIgnoreCase) を実行することと同じではありません。ここで受け入れられた回答を参照してください:文字列比較 - strA.ToLower()==strB.ToLower() or strA.Equals(strB,StringComparisonType)? 特定の種類の文字では分解されます。

解決策は、すべての文字列に対していわゆる SortKey を作成することです。このような SortKey は基本的に、等しいバイトは等しい文字列を意味するというプロパティを持つバイト配列です。(また、SortKeys は string.Compare とまったく同じ順序でバイナリ形式で比較できます。ただし、ここではそのプロパティは必要ありません)。

概要: CompareInfo.GetSortKey(string).KeyData を使用して、ハッシュ可能な byte[] を取得します。( MSDN の GetSortKey ) これは、考えられるすべてのカルチャで機能します。大文字と小文字を区別しない場合にも機能します。

したがって、任意の文字列 (トルコ語の i を使用する場合でも) の大文字と小文字を区別しないハッシュは、次のようにして取得できます。

var sortKeyBytes = CultureInfo.InvariantCulture.CompareInfo.GetSortKey(anyString,
    CompareOptions.IgnoreCase).KeyData;
int hashCode = HashByteArray(sortKeyBytes); //Need to provide this function.
...

byte[] の GetHashCode() は使用できません。このメソッドはオーバーライドされていないため、値ではなくオブジェクト ID を使用するbyte[]デフォルトになります。object.GetHashCode()

この回答のハッシュ関数を使用できます。それは良くありませんが、それは仕事をします。

于 2012-05-04T16:50:51.093 に答える
6

ハッシュを生成する前に s.ToUpperInvariant() を使用できます。両方の方法 (元のハッシュを生成し、元のハッシュをテストするためのハッシュを生成する) を行う限り、機能します。

于 2012-05-04T16:03:20.277 に答える
2

大文字と小文字を区別しないようにするには、大文字と小文字を削除します。

s = s.ToLowerInvariant();

CurrentCultureをデータベースに保存できず、次のような一致のために他の文字列を変換するために使用できない場合は、CurrentCultureを使用しないでください。

s = s.ToLower(System.Globalization.CultureInfo.CurrentCulture);

常に別の(不変ではない)カルチャを使用することを検討できますが、将来のコードメンテナにとっては驚くかもしれません(通常、すべての文字列操作に現在または不変のカルチャを期待します)。

于 2012-05-04T16:07:27.313 に答える