概要
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配列に格納する方法