ホームページ >Java >&#&チュートリアル >Java を使用して変更されたファイルの MD5 値を計算する方法
MD5 (メッセージ ダイジェスト アルゴリズム、メッセージ ダイジェスト アルゴリズム) は、情報の送信が完全かつ一貫していることを確認するために 128 ビット (16 バイト) のハッシュ値 (ハッシュ値) を生成できます。その後ろの数字 5 は、MD4 を置き換えるために発明されたためです。 簡単に理解すると、その機能はファイルに一意の識別子を与えることです。 ファイルの拡張子を変更するとファイルが開けなくなる場合がありますが、MD5 の場合は変更ありません。したがって、ファイルの場合、名前を変更しても md5 検証には役に立ちません。
ここでは、私がこれまでに見た、より頻繁に使用されるアプリケーションのほんの一部を紹介します。
ネットワークは完全ではないため、大きなファイルをダウンロードするときにエラーが発生する可能性があります (小さなファイルでも発生する可能性はありますが、通常はファイルが大きいほどその可能性は高くなります)。これは正常な現象であり、ネットワークが変動するのは正常です。したがって、通常、一部のソフトウェア jar または開発ツールは、ファイルが正しくダウンロードされていないかどうかをユーザーが確認できるように、ダウンロード用のファイルの md5 値 (非常に小さいため、通常はエラーがないと考えられます) を追加で提供します。しかし、今ではネットワークはますます良くなり、基本的にエラーはなくなりました。そのため、ユーザーのネットワーク状態が悪い場合は、エラーを防ぐためにダウンロード後に必ず確認してください。 )
対照的に、md5 値を使用してファイルをアップロードする場合の適用範囲はより広いです。ここでの主な目的は、 ファイル重複排除とファイル フィルタリング です。
最近人気の映画、TV シリーズ、ゲーム、その他の人気リソースなど、ユーザーがアップロードしたファイルには通常、多くの重複が含まれていることを私たちは知っています。実際、これらはユーザーがアップロードしたファイルの大部分を占めるため、同じリソースの場合、保存する必要があるコピーは 1 つだけです。想像してみてください。1 万人のユーザー (おそらく 1 万人未満) が同じ 4 GB のムービーをアップロードすると、必要なディスク容量の合計は 4 * 10000 GB になります。コピーを 1 つだけアップロードする場合、他のユーザーがアップロードする場合は、ファイルの md5 値がローカルで計算され、同じであれば同じファイルとみなされ、4GB のスペースだけで十分です (もちろん、情報を記録するためのスペースのサイズはここでは無視されますが、ファイル自体のサイズと比較すると、この情報は依然として非常に小さいです)。この省スペース化がどれほど大きなものであるか考えてみてください。
私たちの日常生活では、頻繁に使用するはずです。数 GB の大きなファイルのアップロードは数秒で完了します。しかし、インターネットに少し知識がある人なら誰でも、 ネットワークのアップロード速度が遅いことを知っています。がダウンロード速度より小さい (これはエンドユーザーのみ) 、ダウンロード速度に達せず、アップロードさえ不可能です。したがって、ファイルの md5 値の計算処理を行うだけでよく、計算結果に応じて、存在する場合にはアップロードせず、ユーザーがそのファイルを所有していることを記録するだけです。そうでない場合は、正直にアップロードしてください。もちろん、このプロセスは通常非常に時間がかかります。
一部のファイルには著作権とポリシーの問題があり、ユーザーによるアップロードが許可されていません。したがって、ユーザーがアップロードしたファイルも検証され、バックグラウンドでブラックリストと照合されます (これが当てはまります)。照合が成功した場合、ファイルはアップロードできないか、アップロードされたファイルは処理されています。この方法は非常に効率的であり、通常、ユーザーによるいわゆるランダムな名前変更操作はまったく役に立ちません。 したがって、ユーザーは関連するプラットフォームのポリシーと規制に従う必要があります。
通常の状況では、ファイルのバイナリ コンテンツが変更される限り、ファイルの md5 値は確実に変更されます。通常、圧縮ファイルを使用して複数のファイルを圧縮してアップロードする方法があり、これにより圧縮ファイルの md5 値も変更されますが、プラットフォームによってはファイルを解凍することもできるため、万能薬ではありません。ただし、プログラムを通じてファイルのバイナリ データを変更および復元することは比較的簡単です。Java のストリームを使用して、ファイルに対するほとんどすべての操作 (たとえば、ファイルの各バイトを暗号化するため、復元は困難です) を実行できます。ファイルを暗号化するか、セクションを暗号化するか、最初にファイルを作成し、最初にファイルに固定番号を書き込んでから、関連ファイルのデータを書き込むことも良い方法です。)ファイルの場合、単に一連の連続したバイナリ ストリーム (論理的に) と考えることができます。それらを結合 (増加) または切り捨て (減少) することは、非常に単純な操作です。ここでは、 ファイルと、次の知識が関係する単純な操作を示します。 IOストリーム。
このプログラムは、上記の Java ネットワーク プログラミング です。ここではスレッドが削除され、操作が簡略化されています。とにかく、これは目的にのみ使用されます。 md5. 値を計算するため、ユーザーによるその他の操作は必要ありません。
import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.security.DigestInputStream; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import javax.xml.bind.DatatypeConverter; public class TestMD5 { public static void main(String[] args){ for (String filepath : args) { String md5 = computeMD5(new File(filepath)); System.out.println(md5); } } private static String computeMD5(File file) { DigestInputStream din = null; try { MessageDigest md5 = MessageDigest.getInstance("MD5"); //第一个参数是一个输入流 din = new DigestInputStream(new BufferedInputStream(new FileInputStream(file)), md5); byte[] b = new byte[1024]; while (din.read(b) != -1); byte[] digest = md5.digest(); StringBuilder result = new StringBuilder(file.getName()); result.append(": "); result.append(DatatypeConverter.printHexBinary(digest)); return result.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (din != null) { din.close(); } } catch (IOException e) { e.printStackTrace(); } } return null; } }
実行結果
##MD5 値を変更しますここに 2 つの写真があります。それらを結合して、ここに注目してください。マージは、通常のファイルのマージ (9 マスの画像を合成するなど) ではなく、ファイルのバイナリ データのマージです。
まず、ファイルの md5 値を計算します。以下の Ahusky.jpeg は、上の husky.jpeg の名前を変更したものであることに注意してください。変更がないことがわかります。 md5 値にあるので、これは同じファイルです。
#次に、ファイルをマージします。
#マージされたファイルの md5 値を計算します。
以上がJava を使用して変更されたファイルの MD5 値を計算する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。