1

たとえば、クラスPersonという2つのオブジェクトがあります。

Person A:
User_name:n1
Password:1234
Email:n1@email.com

Person B:
User_name:n1
Password:1234
Email:n1@email.com

PersonAとPersonBはどちらも同じ値なので、独自のisValueEqual関数を作成します。まず、クラスを比較したいのですが、次に、値を1つずつキャンプして、等しいかどうかを確認します。この方法は非常に時間がかかると思います。したがって、これはJSON文字列になり、md5を使用してハッシュし、ハッシュのみを比較するのに信頼できると思います。それで、これはそれらの価値を比較するためのより良いアプローチですか?ありがとう。

4

4 に答える 4

5

いいえ。ハッシュ衝突が発生し、 2 つの異なるオブジェクトが同じものとして識別される可能性があります。

フィールドを比較するのに時間がかかるのは何ですか? 計算時間が心配な場合は、最初に測定してください (遅すぎると思われる場合は非常に驚き、ハッシュ計算が大幅に遅くなります)。実装時間が心配な場合は、Apache Commons EqualsBuilderなどを調べてください。

于 2012-11-02T17:17:40.607 に答える
2

ジム・ギャリソンがこのコメントで説明していることをより詳細に説明するには、フィールドを比較してequalsを実装するために必要な作業と、ハッシュを生成してハッシュを比較することによってそれを実装するために必要な作業を考えてみてください。例を見てみましょう。AとBは、電子メールの最後の文字だけが異なります(これは最悪の場合です)。

最初の方法:

  • すべての名前の文字を繰り返し処理し、それらを比較します
  • すべてのパスワード文字を繰り返し処理して比較します
  • すべての電子メール文字を繰り返し処理して比較します。

2番目の方法:

  • 2つの新しいStringBuilderを作成します
  • すべての名前文字を繰り返し処理してJSON文字列に名前を入力し、引用符で囲み、特殊文字をエスケープして、StringBuilderに追加します。
  • すべてのパスワード文字を繰り返し処理してJSON文字列にパスワードを入力し、引用符で囲み、特殊文字をエスケープして、StringBuilderに追加します。
  • すべての電子メール文字を繰り返し処理して、電子メールをJSON文字列に入力し、引用符で囲み、特殊文字をエスケープして、StringBuilderに追加します。
  • StringBuildersを文字列に変換します
  • 文字列をバイト配列に変換します
  • 複雑な暗号化関数を両方のバイト配列に適用します
  • 各バイト配列を反復処理し、バイトを比較します。

人が最初の文字または名前の長さによって異なる場合、最初の方法はすぐに停止しますが、2番目の方法はすべてのステップを実行する必要があることに注意してください。

于 2012-11-02T17:30:36.207 に答える
0

このようなものは、オブジェクトをJSONに変換してから、そのMD5を計算するよりもはるかに高速です。

public boolean equals( Object o ) {
    Person p = null;
    return    o instanceof Person
           && this.name.equals((p = (Person) o).name) 
           && this.password.equals(p.password)
           && this.email.equals(p.email);
}

しかし、私を信じないでください、測定してください。

于 2012-11-02T17:30:09.553 に答える
0

ハッシュ関数は偽陽性を与えるため、最終的に偽の一致にヒットする可能性があります。

ただし、オブジェクトが MD5 を使い果たすことはなく、誤った一致が問題にならない場合は、MD5 を使用できます。

于 2012-11-02T17:19:30.460 に答える