1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Java】画像データからハッシュ値を算出する方法

Posted at

はじめに

ハッシュ値は、データの整合性を確認する際や、データの一意性を保証するためによく使われます。本記事では、Javaを使って画像データからSHA-256のハッシュ値を算出する方法を紹介します。

1. 前提条件

この記事では以下の環境でコードを実行しています:

  • OS:macOS 14.2
  • Javaのバージョン:23.0.1
  • 画像ファイル:ローカル環境に保存されたサンプル画像

2. サンプルコード

以下は、画像データからSHA-256ハッシュ値を算出するJavaコードの例です。

import java.io.FileInputStream;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class ImageHash {
    public static String calculateHash(String filePath) throws NoSuchAlgorithmException, IOException {
        // SHA-256アルゴリズムのMessageDigestインスタンスを作成
        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        FileInputStream fis = new FileInputStream(filePath);
        
        byte[] byteArray = new byte[1024];
        int bytesCount = 0;

        // ファイルを1024バイトずつ読み込み、ハッシュ値を更新
        while ((bytesCount = fis.read(byteArray)) != -1) {
            digest.update(byteArray, 0, bytesCount);
        }
        
        fis.close();

        // 計算したハッシュ値を16進数文字列に変換
        StringBuilder sb = new StringBuilder();
        for (byte b : digest.digest()) {
            sb.append(String.format("%02x", b));
        }
        
        return sb.toString();
    }
    
    public static void main(String[] args) {
        try {
            // 画像ファイルのパスを指定
            String hash = calculateHash("/Users/xxxx/sample.png");  // 存在するパスを指定すること
            System.out.println("Hash: " + hash);
        } catch (NoSuchAlgorithmException | IOException e) {
            e.printStackTrace();
        }
    }
}

・サンプルコード中のファイルパス(例: /Users/xxxx/sample.png)は、この記事用の例です。
・自分の環境に存在する画像ファイルのパスに置き換えてください。

3. コードの説明

1. MessageDigestの利用

  • MessageDigestクラスは、Java標準ライブラリで提供されるハッシュアルゴリズムを実装するクラスです。
  • ここでは、SHA-256アルゴリズムを指定しています。
MessageDigest digest = MessageDigest.getInstance("SHA-256");

2. ファイルの読み込みとハッシュ化

  • 画像データを1024バイトずつ読み込み、digest.update()を使ってハッシュを更新しています。
  • この方法は、大きなファイルでも効率的に処理できます。
while ((bytesCount = fis.read(byteArray)) != -1) {
    digest.update(byteArray, 0, bytesCount);
}

3. ハッシュ値を16進数文字列へ変換

  • digest.digest()メソッドで計算結果を取得し、16進数形式で表示します。
StringBuilder sb = new StringBuilder();
for (byte b : digest.digest()) {
    sb.append(String.format("%02x", b));
}

4. 実行方法

  1. 上記のコードをImageHash.javaという名前で保存する。
  2. ターミナルやコマンドプロンプトを開き、ファイルが保存されているディレクトリに移動する。
  3. 以下のコマンドを実行して、プログラムをコンパイル・実行する。
javac ImageHash.java
java ImageHash

出力例:
スクリーンショット 2024-11-16 15.20.27.png

5. おわりに

今回の記事では、Javaを使った画像データのハッシュ値算出方法について紹介しました。
ハッシュ値の利用は、セキュリティやデータ管理において非常に重要ですので、参考になったら嬉しいです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?