LoginSignup
1
0

More than 5 years have passed since last update.

Androidでファイルハッシュを計算する

Posted at

概要

AndroidでURIからファイルのハッシュを計算する処理を実装しました。

方法

指定したalgorithmでuriの対象となるファイルのハッシュを計算し、Hexで返すculcFileHashメソッドを実装します。

fun culcFileHash(algorithm: String, uri: Uri): String {
    val inputStream = context.contentResolver.openInputStream(uri)
    val buffer = readAll(inputStream)
    val sb = StringBuilder()

    lateinit var md: MessageDigest

    try {
        md = MessageDigest.getInstance(algorithm)
    } catch (e: NoSuchAlgorithmException) {
        e.printStackTrace()
    }

    md.update(buffer)

    for (b in md.digest()) {
        val hex = String.format("%02x", b)
        sb.append(hex)
    }
    return sb.toString()
}

fun readAll(inputStream: InputStream): ByteArray {
    val bOut = ByteArrayOutputStream()
    val buffer = ByteArray(1024*1024*20) //20MB
    while (true) {
        val len = inputStream.read(buffer)
        if (len < 0) {
            break
        }
        bOut.write(buffer, 0, len)
    }
    return bOut.toByteArray()
}

ポイント

URIから実際にファイルの情報を得て色々するためには一度Fileオブジェクトを得る必要があると思っている人が少なからずいる(自分がそうでした)と思いますが、バイナリデータがほしいのであればcontext.contentResolver.openInputStream(uri)を使用することで事足ります。

補足

こちらに背景などもまとめておきました。

参考

Qiita - Javaで暗号化(ハッシュ)
java.io.InputStreamからデータを全て読み込んでbyte配列に格納する方法

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