16

私はそのようにコードのC#行を宣言しました

int hashcode = "apple".GetHashCode();

私のコンピューター、職場のコンピューター、および友人のコンピューターでは、結果は 1657858284 でした。開発サーバーでは、結果は 1548091822 でした。どのサーバーにありますか?

more notes 最初に、バージョンに違いがあることに気付きました... 1657858284 の結果は .NET 3.5 と .NET 4.0 のものでした。1548091822 は .NET 2.0 からのものです。

次に、Visual Studio 2010 にプロジェクトを .net 2.0 プロジェクトとしてコンパイルするように指示しましたが、それでも 1657858284 が返されました。

4

4 に答える 4

24

他の人が指摘したように、それはドキュメントに従っています。GetHashCode が同じものを返すことに依存してはなりません。信頼できる唯一の不変条件は、オブジェクトがその等価セマンティクスを変更するような方法で変更されていない場合、同じ appdomain 内の同じオブジェクトに対して同じ値を返すということです。これらの条件のいずれかが満たされない場合 (2 つのオブジェクトが異なるアプリケーション ドメインにある場合、またはオブジェクトがその等価セマンティクスを変更する方法で変更された場合)、「同一の」オブジェクトが同じハッシュを返すという保証はまったくありません。コード。

ハッシュ コードを使用する唯一の目的は、ハッシュ テーブルのバランスを取ることです。その他の使用は「適応外」であり、自己責任で行ってください。やらないでください。任意の境界を越えて機能する安定した文字列ハッシュが必要な場合は、SHA256 などの業界標準のアルゴリズムを使用してください。

このテーマに興味がある場合は、ハッシュの問題に関する記事のアーカイブを参照してください。

http://blogs.msdn.com/b/ericlippert/archive/tags/hashing/

于 2011-05-24T18:14:11.693 に答える
17

2 つの異なるバージョンの .Net を使用している可能性があります。この動作は、MSDN の記事に記載されています:
http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx
コメントから:

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

于 2011-05-24T18:04:59.740 に答える
2

カスタム クラスが安定したハッシュ コードを返すようにするには、GetHashCode() メソッドをオーバーライドする必要があります。そうしないと、Object クラスの GetHashCode メソッドが使用されます。(インスタンス固有の場合もあります)。

于 2011-05-24T18:06:36.403 に答える
1

たとえば、トランスポートでデータの整合性をすばやく検証できるようにするチェックサムが必要な場合は、次のように、適切なビット数で (暗号化) ハッシュを実行するだけです。

- MD5
- SHA256
- SHA1
- fletcher

.NetGetHashCodeは何かを識別するためのものではありません (とにかく 32 ビットはすぐに衝突を引き起こすため、とにかく文字列を識別するために使用することはできません)。

上記の 4 つでさえ、衝突が許可されることに注意してください (ただし、すぐには発生しません)。そのため、識別ではなくチェックサムとしてのみ使用してください。

于 2011-06-01T23:37:12.043 に答える