我正在尝试计算图像的哈希值,这样当用户重命名文件时,应用程序仍然可以识别它。
所以现在我已经尝试使用哈希值,我想我会计算出图像的SHA-256。当然,在部署之前,我想测试这个应用程序,所以我创建了一个工具测试。
问题是,它在本地工作,但当我在GithubActions上运行它时(使用
reactivecircus/android-emulator-runner@v2
),测试失败。我没有太多注意这两个设备之间的差异,它们在API版本(26和31)中是不同的,甚至可能是架构。
以下是运行方式不同的代码:
val expected = "bcc060400f0da1b937307daafecc12b5016334cd5023aafa47ff5c31b9a1f2ca"
val bitmap =
BitmapFactory.decodeResource(
context.resources,
R.drawable.unsplash_flowers,
)
val byteArray =
bitmap.run {
val size: Int = this.rowBytes * this.height
val byteBuffer = ByteBuffer.allocate(size)
this.copyPixelsToBuffer(byteBuffer)
return@run byteBuffer.array()
}
val sha256 = MessageDigest.getInstance("SHA-256")
val digest = sha256.digest(byteArray)
val actual = BigInteger(1, digest).toString(16)
Assert.assertEquals(expected, actual)
bitmap.recycle()
稍后,我还创建了一个测试来计算纯哈希值(以确保哈希算法按预期工作)。
因此,此代码的运行方式相同(测试在两种情况下都通过):
val expected = "da9a9fc7b09edde9cc23cec9b7e11a71fb0ab4d2ddd8af8af905306f3e1456fb"
val sha256 = MessageDigest.getInstance("SHA-256")
val digest = sha256.digest("sdsdsds".toByteArray(Charsets.UTF_8))
val actual = BigInteger(1, digest).toString(16)
Assert.assertEquals(expected, actual)
所以这就留给我代码的第一部分
Bitmap
可以不同的转换代码:
val bitmap =
BitmapFactory.decodeResource(
context.resources,
R.drawable.unsplash_flowers,
)
val byteArray =
bitmap.run {
val size: Int = this.rowBytes * this.height
val byteBuffer = ByteBuffer.allocate(size)
this.copyPixelsToBuffer(byteBuffer)
return@run byteBuffer.array()
}
可以不同的两个功能是
-
BitmapFactory.decodeResource
-
copyPixelsToBuffer
这些功能在不同的安卓版本中会有所不同吗?
事实上,我唯一关心的是,这个哈希在Android版本之间不会改变,在不同的设备上可能会有所不同。