4

数値の配列が与えられた場合、その組み合わせをできるだけ一意に表す数値識別子を作成したいと思います。

例えば:

int[] inputNumbers = { 543, 134, 998 };
int identifier = createIdentifier(inputNumbers);
System.out.println( identifier );

出力:

4532464234

- 返される番号はできるだけ一意である必要があります

-要素の順序が結果に影響を与える必要があります

-アルゴリズムは、同じ入力配列から常に同じ結果を返す必要があります

- アルゴリズムは、'for' ループで多く使用されるように、できるだけ高速である必要があります

このアルゴリズムの目的は、DB に格納される小さな値を作成し、簡単に比較できるようにすることです。重要なことではないので、いくつかの数値の配列が同じ値を返すことは許容されますが、そのようなケースはめったにありません。

これを達成するための良い方法を提案できますか?

4

4 に答える 4

8

の標準 ( Java 7 ) 実装にArrays.hashCode(int[])は、必要なプロパティがあります。次のように実装されます。

 2938       public static int hashCode(int a[]) {
 2939           if (a == null)
 2940               return 0;
 2941   
 2942           int result = 1;
 2943           for (int element : a)
 2944               result = 31 * result + element;
 2945   
 2946           return result;
 2947       }

ご覧のとおり、実装は高速で、結果は要素の順序と要素の値によって異なります。


ハッシュ値がすべての Java プラットフォームで同じであるという要件がある場合は、それが満たされていることを信頼できると思います。List<Integer>.hashcode()javadoc によると、このメソッドは、同等のリストを呼び出したときに取得した値と同じ値を返します。そして、そのハッシュコードの式指定されています。

于 2013-09-17T14:20:59.847 に答える
2

を見てくださいArrays.hashCode(int[])。まさにこれを行っています。

ドキュメンテーション

于 2013-09-17T14:16:13.717 に答える
1

探しているのは、配列のハッシュ コードです。

int hash = Arrays.hashCode(new int[]{1, 2, 3, 4});

Java APIも参照してください。

于 2013-09-17T14:16:25.763 に答える
1

また、ある種のハッシュ関数を探しているとも言います。

ポイント 3 にどれだけ依存するかはわかりませんThe algorithm must return always the same result from the same input arrayが、これは JVM の実装に依存します。

そのため、ユースケースによっては、問題が発生する可能性があります (その場合の解決策は、extern ハッシュ ライブラリを使用することです)。

詳細については、この SO の質問をご覧ください: Java, Object.hashCode() result constant across all JVMs/Systems?

編集

値をDBに保存したいと読んだところです。その場合、信頼性が高く、呼び出されるたびに同じ値を生成することが保証されている extern hasing ライブラリを使用することをお勧めします。そうしないと、アプリケーションを起動するたびに DB 全体を再ハッシュして、一貫性のある状態にする必要があります。

EDIT2

プレーンな s のみを使用しているためint、ハッシュ値は毎回同じである必要があります。@Stephen Cが彼の答えで示したように。

于 2013-09-17T14:21:44.877 に答える