2011-11-06 25 views
15

可能性の重複:この呼び出しによって生成された.NET文字列ハッシュ関数は移植可能ですか?

"my string".GetHashCode() 

コードが将来にデータベースに格納されます。私はC#4.0を使用して呼び出すことによって、文字列のハッシュを取得し
How do I create a HashCode in .net (c#) for a string that is safe to store in a database?

つかいます。このハッシュコードを使用して、文字列のサブセットを検索し、次に同等の比較を行います。

質問は以下のとおりです。それは標準化されたハッシュ計算

  1. ですか?私はそれがのC#のような異なる環境で同じハッシュを計算することが可能であると仮定してもよいでしょう。
  2. Java、PL/SQL、Rubyなどで書くと、同じハッシュ関数を自分で計算することはできますか?
  3. 今日作成されたハッシュが同じ環境の で明日同じであると仮定できますか?たとえば、コンピュータをシャットダウンした後に、 プログラムを再度実行するか、ロケールやその他の設定を変更しますか?
  4. 移植性の限界は何ですか?
  5. 私は自分でそれをやることができますが、多少の移植性があるかもしれません。 MSDNから
+13

NO、NO、NO、NO、NOはありません。「移植性」はまったくありません。また、「移植性」もありません。 **あなたが何を記述しているのかは絶対に決してありません。** –

答えて

18

:GetHashCodeメソッドの

デフォルトの実装では、異なるオブジェクトの一意の戻り値を保証するものではありません。さらに、.NET FrameworkではGetHashCodeメソッドの既定の実装が保証されておらず、返される値は.NET Frameworkの異なるバージョン間で同じになります。したがって、このメソッドのデフォルトの実装は、ハッシングの目的で一意のオブジェクト識別子として使用されてはなりません。

だから、GetHashCodeによって生成された値が安定していると仮定することはできません。これは単なる理論的なものではなく、we've seen the value change in the pastです。

安定したハッシュが必要な場合は、自分で生成する必要があります。

+0

"デフォルトの実装" - 'String'はデフォルトの実装を使用していますか?私は正直に分かりません、私はちょうど(ハッシュテーブルの価値によって扱われるように)それを期待しませんでした。 – delnan

+3

'System.String'は' GetHashCode'をオーバーライドし、[そのドキュメント](http://msdn.microsoft.com/en-us/library/system.string.gethashcode.aspx)にも同様の注釈が含まれています:* GetHashCodeの実装は、その実装に依存します。これは、共通言語ランタイムのあるバージョンから別のバージョンに変更される可能性があります。これが発生する理由は、GetHashCode。*のパフォーマンスを向上させることです。GetHashCodeによって返される値はプラットフォームに依存します。これは、.NET Frameworkの32ビット版と64ビット版で異なります。* –

2

番号ポータブルではありません。 neverは、ハッシュツリーのバランスをとる以外の目的にこのメソッドを使用してください。フレームワークのバージョン間で実装が変更され、32ビット/ 64ビットCLRの動作が異なります。

Eric Lippertには、この機能のルールと適切な用途についてのblog postがあります。

代わりに、データベースにハッシュを挿入するにはSHA1Managedを使用する必要があります。

3

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

。NET Frameworkは、 GetHashCodeメソッドの既定の実装を保証しません。返される値は、異なるバージョンの.NET Framework間で同じ になります。その結果、このメソッドのデフォルトの実装である は、ハッシュの目的でユニークな オブジェクト識別子として使用されてはなりません。

関連する問題