MD5 は反復アルゴリズムです。大量の小さな MD5 を計算してから、それらを何らかの方法で組み合わせる必要はありません。ファイルの小さなチャンクを読み取り、ダイジェストに追加するだけなので、一度にファイル全体をメモリに保持する必要はありません。これがJavaの実装です。
FileInputStream f = new FileInputStream(new File("bigFile.txt"));
MessageDigest digest = MessageDigest.getInstance("md5");
byte[] buffer = new byte[8192];
int len = 0;
while (-1 != (len = f.read(buffer))) {
digest.update(buffer,0,len);
}
byte[] md5hash = digest.digest();
出来上がり。一度にファイル全体をメモリに保持することなく、ファイル全体の MD5 を取得できます。
何らかの理由で、ファイルのサブセクションの MD5 ハッシュが必要な場合 (これは、低帯域幅接続を介して転送される大きなファイルの中間チェックを行うのに役立つ場合があります)、複製することでそれらを取得できることに注意してください。そのように、いつでもダイジェスト オブジェクト
byte[] interimHash = ((MessageDigest)digest.clone()).digest();
これは実際のダイジェスト オブジェクトには影響しないため、引き続き MD5 ハッシュ全体を操作できます。
また、MD5 は暗号化目的 (信頼できないソースからのファイルの信頼性の検証など) では古いハッシュであり、ほとんどの状況では SHA-1 などのより適切なものに置き換える必要があることにも注意してください。2 つの信頼できるソース間のファイルの整合性を検証するなど、暗号化以外の目的では、MD5 で十分です。