Javaで一連の文字列のハッシュを計算したいと思う。はい、私は文字列をソートし、digest.update
を使用して MD5ハッシュ反復を計算することができます。 しかし、私は、ソートを省略してcombineUnordered
https://github.com/google/guava/wiki/HashingExplained のようなものを使用することを好むがあり、このようなOrder-independant Hash Algorithm と同じを求めて同様の質問がたくさんあるが、それらの非Javaで反復順序の独立したハッシュを計算する方法を示す簡単な例を提供します。Javaで独立したハッシュを注文する
答えて
だけXOR各ハッシュと順序は重要ではありません。さらに、ハッシュサイズはコレクションのサイズとともに大きくなるのではなく固定されます。 Java文字列のハッシュコードに組み込まれた使用
ハッシュコード:
int hashcode = strings.stream()
.mapToInt(Object::hashCode)
.reduce(0, (left, right) -> left^right);
ハッシュコード尋ねた質問のようにグアバとMD5を使用して:
Optional<byte[]> hash = strings.stream()
.map(s -> Hashing.md5().hashString(s, Charset.defaultCharset()))
.map(HashCode::asBytes)
.reduce((left, right) -> xor(left, right));
static byte[] xor(byte[] left, byte[] right) {
if(left.length != right.length) {
throw new IllegalArgumentException();
}
byte[] result = new byte[left.length];
for(int i=0; i < result.length; i++) {
result[i] = (byte) (left[i]^right[i]);
}
return result;
}
これが望ましい方法です。ハッシュを排他的論理和(XOR)することは、それらを追加する方がよい。 –
@ Magnusありがとう私は 'XOR'を試してみます。 –
各文字列のMD5ハッシュを個別に計算し、それらをすべて追加して1つのハッシュを得ることができます。それは順序に依存しないでしょう。加算演算は可換であるためです。ここ
は、(我々が与えられた文字列のMD5ハッシュを計算し、16進形式で結果を返すメソッドmd5Hex(文字列str)を有すると仮定した場合)の例である:
String[] strings = {"str1", "str2", "str3", ...};
BigInteger hashSum = BigInteger.ZERO;
for(String s : strings) {
String hexHash = md5Hex(s);
hashSum = hashSum.add(new BigInteger(hexHash, 16));
}
String finalHash = hashSum.toString(16);
はい、ありがとうございます。質問の背景(downwotedでも)は、このようにしなければならないか、ソートされていない可能性の高いものを組み合わせることができる代替ハッシュアルゴリズムを使用して衝突を少なくします。 –
@MarmiteBomberは、例を追加しました。 – elyor
- 1. アンドロイドスタジオで独立した独立したgradleタスクを実行
- 2. Javaシステムクロック独立したスケジューリング/ポーズ
- 3. 独立したプライベートセッション
- 4. 独立したJavaファイルのメソッドを使用する
- 5. 独立した状態をJavaのenum値に設定する
- 6. javaパスの独立性
- 7. kペアワイズ独立ハッシュ関数を生成する
- 8. 独立した不安定な独立したアニメーションに反応しますか?
- 9. UITableView独立したセクションをロードする
- 10. 注文ハッシュ/配列
- 11. STL独立したイニシャライザリスト
- 12. uNet独立したクライアント/サーバ
- 13. 独立したJUnitテストスプリング@Autowired
- 14. 独立したプラグインのサブモジュール
- 15. fullpage.js独立したセクション
- 16. Joomla - 独立したSQLクエリ
- 17. HLS MP4独立したセグメント
- 18. Node.jsの独立したソケットセッション
- 19. 独立したスレッドでのオブジェクトのJava深層クローンのリスト
- 20. 独立したリストを作る
- 21. Eclipse - 2つの独立したソースフォルダをJavaプロジェクトに作成
- 22. ajaxリクエストの独立したサーバーセッションを確立しますか?
- 23. Pythonで独立したChi Squareテスト
- 24. Javaアプリケーションからシェルスクリプトを独立して実行する
- 25. は独立して
- 26. グローバル変数用のJava独立ファイル
- 27. アンドロイドアプリの独立したデータベースを使用
- 28. SQLAlchemy Coreで複数の独立した文を実行しますか?
- 29. 独立したJavaコードでAndroidの内部メモリにアクセスします
- 30. 別のクラスから独立したJavaクラスを起動するには?
youneedがセットのハッシュアルゴリズムを上書きするために行う理由? –
@SzigyártóMihály上書きする必要はありません、私は簡単な例を探しています。私はMD5を知っています。これは注文に敏感で、MurmurHashは使用すべきではありませんが、使用例が見つかりませんでした。 –
セットはアイテムのハッシュの合計を使用しますが、順序に依存しません。 –