Android や JVM 環境の Kotlin でファイルの MD5 を計算する実装です。
前提
InputStream からデータを読み込み、JDK の java.security
を利用して MD5 を計算する方針とします。
ファイルサイズがある程度大きい (1MB ~) 状況を想定し InputStream からの読み込みとしています。
実装
import java.io.InputStream
import java.security.DigestInputStream
import java.security.MessageDigest
...
val inputStream: InputStream = ... // File の inputStream など
val md5 = DigestInputStream(inputStream, MessageDigest.getInstance("MD5")).use { input ->
val buffer = ByteArray(1024 * 1024) // buffer size は任意のサイズ (ここでは1MB)
var read = 0
while (read != -1) {
// ファイル末尾まで読み込む
read = input.read(buffer)
}
input.messageDigest.digest().joinToString("") { "%02x".format(it) }
}
// md5(例) => "fb0bf2b96b28cf776cd898e4098485e2"
解説
java.security.MessageDigest
により MD5 を計算します。入力が InputStream の場合は java.security.DigestInputStream
にデータを通すことで MD5 が計算されます。
MessageDigest, DigestInputStream は Android でも利用可能です。
MessageDigest#digest() で計算した MD5 は ByteArray 形式であるため "%02x".format(...)
により 16 進数文字列へ変換します。
InputStream を使わない場合
InputStream ではなく ByteArray でデータを保持している場合は DigestInputStream を使わずに MessageDigest#digest(input: ByteArray) だけで計算可能です