名前は異なるが内容が同じである 2 つのファイルがあります。これらのファイルのストリームを作成し、FileInputStream.HashCode();
メソッドを使用してハッシュ値を見つけると、さまざまな値を受け取ります
同じ内容のファイルに対して同じハッシュ値を受け取るJavaのハッシュメソッドについて、可能であれば誰かが正しいAPIを提供してくれますか?
暗号化ハッシュ関数がニーズを満たすようです。
Apache Commons Codecライブラリには、 DigestUtilsと呼ばれる暗号化ハッシュ値 (別名、メッセージ ダイジェスト) を作成するためのユーティリティ クラスがあります。たとえば、このsha256
メソッドは を受け取り、InputStream
SHA-256 メッセージ ダイジェストをバイト配列として返します。
FileInputStream には、hashCode() という名前のメソッドはありません。一般的なObject.hasCode()メソッドを使用します。
オブジェクトのハッシュ コード値を返します。このメソッドは、HashMap によって提供されるものなどのハッシュ テーブルの利点のためにサポートされています。
hashCode の一般的な契約は次のとおりです。
- Java アプリケーションの実行中に同じオブジェクトに対して複数回呼び出された場合は常に、オブジェクトの equals 比較で使用される情報が変更されていない限り、hashCode メソッドは一貫して同じ整数を返す必要があります。この整数は、あるアプリケーションの実行から同じアプリケーションの別の実行まで一貫性を保つ必要はありません。
- equals(Object) メソッドに従って 2 つのオブジェクトが等しい場合、2 つのオブジェクトのそれぞれで hashCode メソッドを呼び出すと、同じ整数結果が生成される必要があります。
- equals(java.lang.Object) メソッドに従って 2 つのオブジェクトが等しくない場合、2 つのオブジェクトのそれぞれで hashCode メソッドを呼び出すと、異なる整数結果が生成される必要はありません。ただし、プログラマーは、等しくないオブジェクトに対して個別の整数結果を生成すると、ハッシュ テーブルのパフォーマンスが向上する可能性があることに注意する必要があります。
合理的に実用的である限り、クラス Object によって定義された hashCode メソッドは、個別のオブジェクトに対して個別の整数を返します。(これは通常、オブジェクトの内部アドレスを整数に変換することによって実装されますが、この実装手法は JavaTM プログラミング言語では必要ありません。)
FileInputStream.HashCode()
内部アドレスである を継承しhashCode
ます。Object
内容は考慮していません。
また、2 つのファイルの等価性を比較したい場合、なぜハッシュ関数を使用するのでしょうか?
衝突により、異なる 2 つの文字列が同じハッシュ コードを持つ場合があります。ファイルの内容と同じです。
FileUtils.contentEquals(file1, file2);
サードパーティのライブラリ(Commons IO)を利用できるなら使える