refactor HashFunction

This commit is contained in:
2025-11-10 14:26:41 +01:00
parent e3619a2df1
commit e7e43f9cca
15 changed files with 115 additions and 126 deletions

View File

@@ -1,8 +1,7 @@
package com.infendro.hash.md
import com.infendro.bytearray.ByteOrder
import com.infendro.bytearray.addAll
import com.infendro.bytearray.toByteArray
import com.infendro.bytearray.ByteOrder.LITTLE_ENDIAN
import com.infendro.bytearray.toUByteArray
import com.infendro.bytearray.toUIntArray
import com.infendro.hash.HashFunction
@@ -11,7 +10,7 @@ object MD5 : HashFunction() {
override val bytes: Int
get() = 16
private val s = arrayOf(
private val s = intArrayOf(
7, 12, 17, 22,
7, 12, 17, 22,
7, 12, 17, 22,
@@ -30,7 +29,7 @@ object MD5 : HashFunction() {
6, 10, 15, 21,
)
private val k = arrayOf(
private val k = uintArrayOf(
0xd76aa478U, 0xe8c7b756U, 0x242070dbU, 0xc1bdceeeU,
0xf57c0fafU, 0x4787c62aU, 0xa8304613U, 0xfd469501U,
0x698098d8U, 0x8b44f7afU, 0xffff5bb1U, 0x895cd7beU,
@@ -50,8 +49,8 @@ object MD5 : HashFunction() {
)
override fun hash(
value: ByteArray,
): ByteArray {
value: UByteArray,
): UByteArray {
var a0 = 0x67452301U
var b0 = 0xefcdab89U
var c0 = 0x98badcfeU
@@ -60,18 +59,18 @@ object MD5 : HashFunction() {
val paddedValue = buildList {
addAll(value)
add(0x80.toByte())
add(0x80U)
while (size % 64 != 56) {
add(0x00.toByte())
add(0x00U)
}
addAll(ml.toByteArray(ByteOrder.LITTLE_ENDIAN))
addAll(ml.toUByteArray(LITTLE_ENDIAN))
}
val chunks = paddedValue
.chunked(64)
.chunked(64) { it.toUByteArray() }
for (chunk in chunks) {
val w = buildList {
addAll(chunk.toUIntArray(ByteOrder.LITTLE_ENDIAN))
addAll(chunk.toUIntArray(LITTLE_ENDIAN))
}
var a = a0
@@ -104,11 +103,11 @@ object MD5 : HashFunction() {
d0 += d
}
return byteArrayOf(
*a0.toByteArray(ByteOrder.LITTLE_ENDIAN),
*b0.toByteArray(ByteOrder.LITTLE_ENDIAN),
*c0.toByteArray(ByteOrder.LITTLE_ENDIAN),
*d0.toByteArray(ByteOrder.LITTLE_ENDIAN),
return ubyteArrayOf(
*a0.toUByteArray(LITTLE_ENDIAN),
*b0.toUByteArray(LITTLE_ENDIAN),
*c0.toUByteArray(LITTLE_ENDIAN),
*d0.toUByteArray(LITTLE_ENDIAN),
)
}
}