0

私は数学に優れたスキルを持っていないので、将来変更される可能性があるクラスで使用する必要があるアルゴリズムが存在するかどうかを尋ねます.

次のシナリオを検討してください。

クラス「ロール」には次のフィールドがあります。

private boolean admin;
private boolean printer;

数週間後、ロール「ゲスト」を追加することにしました。

private boolean admin;
private boolean printer;
private boolean guest;

数週間後、「プリンター」の役割を削除することにしました。

private boolean admin;
private boolean guest;

ハッシュコードをデータベースに永続化するため、このクラスのすべてのバージョンが一意のハッシュコードを生成することを 100% 確信する必要があります。

これは問題ではないかもしれませんが、私は常に Eclipse IDE ソース ジェネレーターで提供されているものを使用してきました。

Eclipse IDE (Indigo) Java バージョン >= 6 メソッドで安全かどうか、またはこのトピックに関する他のアドバイスを教えてください。これは非常に一般的なことだと確信しています。

前もって感謝します

4

2 に答える 2

12

データベースにハッシュコードを永続化するので

そうしないでください。の結果は永続化することを意図hashCodeしていません。特に、ドキュメントから:

この整数は、あるアプリケーションの実行から同じアプリケーションの別の実行まで一貫性を保つ必要はありません。

次:

このクラスのすべてのバージョンが一意のハッシュコードを生成することを 100% 確信している必要があります。

ハッシュコードも一意であることを意図していません...そうではないことがよくあります。さて、あなたのケースでは5ビットのデータしかありませんが、一般的にはそうではありません...

通常の要件とは異なる要件があるようですObject.hashCode()-そのため、自動生成された実装が特別な要件を認識することを期待すべきではありません。あなたの要件が何であるかを正確に述べることをお勧めします。そうすれば、何をすべきかを解決できます...

于 2012-08-03T19:03:28.647 に答える
2

32ビットハッシュコードとUUIDの違い、および誕生日のパラドックスごとの衝突の可能性を理解するために、これは、2つが同じ値になる可能性を50%取得するために生成する必要のあるIDの数です(衝突):

32ビットハッシュコード-77,000

128ビットUUID-22,000,000,000,000,000,000

ハッシュコードは一意性を約束するものではなく、通常の使用では衝突が予想されます。UUIDは、実際には衝突が非常に起こりにくい、実用的な一意性を約束します。

http://blogs.msdn.com/b/ericlippert/archive/2010/03/22/socks-birthdays-and-hash-collisions.aspxおよびhttp://en.wikipedia.org/wiki/Universally_unique_identifierを参照してください

于 2012-08-03T20:05:29.327 に答える