From 2ae6fda70edb6fbfcd64ad56f77ba4bf8bbf7949 Mon Sep 17 00:00:00 2001 From: Infendro Date: Fri, 30 Jan 2026 15:16:48 +0100 Subject: [PATCH] implement xoshiro256++ and xoshiro256** --- .../com/infendro/random/prng/Xoshiro256pp.kt | 28 +++++++++++++++++++ .../com/infendro/random/prng/Xoshiro256ss.kt | 28 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 src/commonMain/kotlin/com/infendro/random/prng/Xoshiro256pp.kt create mode 100644 src/commonMain/kotlin/com/infendro/random/prng/Xoshiro256ss.kt diff --git a/src/commonMain/kotlin/com/infendro/random/prng/Xoshiro256pp.kt b/src/commonMain/kotlin/com/infendro/random/prng/Xoshiro256pp.kt new file mode 100644 index 0000000..ff60ce8 --- /dev/null +++ b/src/commonMain/kotlin/com/infendro/random/prng/Xoshiro256pp.kt @@ -0,0 +1,28 @@ +package com.infendro.random.prng + +import com.infendro.bytes.bytearray.toLongArray +import com.infendro.hash.sha2.`SHA-256` +import com.infendro.random.PRNG +import kotlin.properties.Delegates.notNull + +class Xoshiro256pp : PRNG() { + private var s: LongArray by notNull() + + override fun seed(seed: ByteArray) { + s = `SHA-256`.hash(seed).toLongArray() + } + + override fun generate(): Int { + val result = (s[0] + s[3]).rotateLeft(23) + s[0] + + val t = s[1] shl 17 + s[2] = s[2] xor s[0] + s[3] = s[3] xor s[1] + s[1] = s[1] xor s[2] + s[0] = s[0] xor s[3] + s[2] = s[2] xor t + s[3] = s[3].rotateLeft(45) + + return (result ushr 32).toInt() + } +} diff --git a/src/commonMain/kotlin/com/infendro/random/prng/Xoshiro256ss.kt b/src/commonMain/kotlin/com/infendro/random/prng/Xoshiro256ss.kt new file mode 100644 index 0000000..6fbfb1a --- /dev/null +++ b/src/commonMain/kotlin/com/infendro/random/prng/Xoshiro256ss.kt @@ -0,0 +1,28 @@ +package com.infendro.random.prng + +import com.infendro.bytes.bytearray.toLongArray +import com.infendro.hash.sha2.`SHA-256` +import com.infendro.random.PRNG +import kotlin.properties.Delegates.notNull + +class Xoshiro256ss : PRNG() { + private var s: LongArray by notNull() + + override fun seed(seed: ByteArray) { + s = `SHA-256`.hash(seed).toLongArray() + } + + override fun generate(): Int { + val result = (s[1] * 5).rotateLeft(7) * 9 + + val t = s[1] shl 17 + s[2] = s[2] xor s[0] + s[3] = s[3] xor s[1] + s[1] = s[1] xor s[2] + s[0] = s[0] xor s[3] + s[2] = s[2] xor t + s[3] = s[3].rotateLeft(45) + + return (result ushr 32).toInt() + } +}