From d4be1689e25d97a5cc136f547bf6c69976d1c832 Mon Sep 17 00:00:00 2001 From: Infendro Date: Sat, 13 Dec 2025 23:51:08 +0100 Subject: [PATCH] optimize `nextBytes()` --- .../kotlin/com/infendro/random/csprng/HMAC.kt | 1 - .../kotlin/com/infendro/random/prng/LCG.kt | 1 - .../kotlin/com/infendro/random/prng/PRNG.kt | 25 +++++++++++++++++-- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/commonMain/kotlin/com/infendro/random/csprng/HMAC.kt b/src/commonMain/kotlin/com/infendro/random/csprng/HMAC.kt index 66cd4ec..58b496b 100644 --- a/src/commonMain/kotlin/com/infendro/random/csprng/HMAC.kt +++ b/src/commonMain/kotlin/com/infendro/random/csprng/HMAC.kt @@ -35,7 +35,6 @@ class HMAC internal constructor( val bytes = buildList { while (size < count) { v = hmac.hash(k, v) - addAll(v.take(min(count - size, function.bytes))) } }.toUByteArray() diff --git a/src/commonMain/kotlin/com/infendro/random/prng/LCG.kt b/src/commonMain/kotlin/com/infendro/random/prng/LCG.kt index d3bbe82..9e72a73 100644 --- a/src/commonMain/kotlin/com/infendro/random/prng/LCG.kt +++ b/src/commonMain/kotlin/com/infendro/random/prng/LCG.kt @@ -26,7 +26,6 @@ class LCG internal constructor() : PRNG() { return buildList { while (size < count) { x = (a * x + c) % m - addAll(x.toUByteArray().takeLast(min(count - size, 6))) } }.toUByteArray() diff --git a/src/commonMain/kotlin/com/infendro/random/prng/PRNG.kt b/src/commonMain/kotlin/com/infendro/random/prng/PRNG.kt index 751aa33..52547a7 100644 --- a/src/commonMain/kotlin/com/infendro/random/prng/PRNG.kt +++ b/src/commonMain/kotlin/com/infendro/random/prng/PRNG.kt @@ -15,12 +15,33 @@ abstract class PRNG : Random() { override fun nextBits( bitCount: Int, ): Int { - if (bitCount !in 0..32) throw Exception() - if (bitCount == 0) return 0 + if (bitCount !in 0..32) + throw IllegalArgumentException() + if (bitCount == 0) + return 0 return generate(4).toInt() ushr (32 - bitCount) } + override fun nextBytes( + array: ByteArray, + fromIndex: Int, + toIndex: Int, + ): ByteArray { + if (fromIndex !in 0..array.size || toIndex !in 0..array.size) + throw IllegalArgumentException() + if (fromIndex > toIndex) + throw IllegalArgumentException() + + val size = toIndex - fromIndex + val bytes = generate(size).asByteArray() + for (i in 0..