1. 概要

このミニ記事では、チェックサムとは何かについて簡単に説明し、チェックサムを計算するためのJavaの組み込み機能のいくつかを使用する方法を示します。

2. チェックサムと一般的なアルゴリズム

基本的に、チェックサムは、データのバイナリストリームの縮小表現です。

チェックサムは通常、完全なメッセージが受信されたことを確認するためのネットワークプログラミングに使用されます。 新しいメッセージを受信すると、チェックサムを再計算し、受信したチェックサムと比較して、ビットが失われていないことを確認できます。 さらに、ファイルの比較や変更の検出など、ファイル管理にも役立つ場合があります。

Adler32やCRC32など、チェックサムを作成するための一般的なアルゴリズムがいくつかあります。 これらのアルゴリズムは、データまたはバイトのシーケンスを文字と数字のはるかに小さなシーケンスに変換することによって機能します。  これらは、入力の小さな変更が大幅に異なる計算されたチェックサムになるように設計されています。

JavaのCRC32のサポートを見てみましょう。 CRC32はチェックサムには役立つ場合がありますが、パスワードのハッシュなどの安全な操作にはお勧めできません。

3. 文字列またはバイト配列からのチェックサム

最初に行う必要があるのは、チェックサムアルゴリズムへの入力を取得することです。

String から始める場合は、 getBytes()メソッドを使用して、Stringからバイト配列を取得できます。

String test = "test";
byte[] bytes = test.getBytes();

次に、バイト配列を使用してチェックサムを計算できます。

public static long getCRC32Checksum(byte[] bytes) {
    Checksum crc32 = new CRC32();
    crc32.update(bytes, 0, bytes.length);
    return crc32.getValue();
}

ここでは、Javaの組み込みCRC32クラスを使用しています。 クラスがインスタンス化されたら、 update メソッドを使用して、Checksumインスタンスを入力からのバイトで更新します。

簡単に言えば、 アップデートメソッドは、によって保持されているバイトを置き換えます CRC32 物体 –これはコードの再利用に役立ち、の新しいインスタンスを作成する必要がなくなります。 チェックサム。  The CRC32 classは、バイト配列全体またはその中の数バイトを置き換えるためのいくつかのオーバーライドされたメソッドを提供します。

最後に、bytes を設定した後、 getValueメソッドを使用してチェックサムをエクスポートします。

4. InputStreamからのチェックサム

をバイナリデータのより大きなデータセットで処理する場合、すべてのバイトがメモリにロードされるため、上記のアプローチはメモリ効率があまり高くありません。

InputStream がある場合、 CheckedInputStream を使用してチェックサムを作成することを選択できます。このアプローチを使用すると、任意で処理されるバイト数を定義できます。一度。

この例では、ストリームの最後に到達するまで、その時点で指定された量のバイトを処理します。

チェックサム値は、CheckedInputStreamから入手できます。

public static long getChecksumCRC32(InputStream stream, int bufferSize) 
  throws IOException {
    CheckedInputStream checkedInputStream = new CheckedInputStream(stream, new CRC32());
    byte[] buffer = new byte[bufferSize];
    while (checkedInputStream.read(buffer, 0, buffer.length) >= 0) {}
    return checkedInputStream.getChecksum().getValue();
}

5. 結論

このチュートリアルでは、JavaのCRC32サポートを使用して、バイト配列とInputStreamからチェックサムを生成する方法を説明します。

いつものように、コードはGitHubから入手できます。