Skip to content

Commit daf1bb6

Browse files
committed
add option for insecure random with kulid
1 parent 980b11a commit daf1bb6

3 files changed

Lines changed: 40 additions & 7 deletions

File tree

benchmark/src/commonMain/kotlin/dev/phillipslabs/kulid/benchmark/ULIDBenchmark.kt

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,29 @@ package dev.phillipslabs.kulid.benchmark
22

33
import dev.phillipslabs.kulid.ULID
44
import kotlinx.benchmark.Benchmark
5+
import kotlinx.benchmark.Blackhole
56
import kotlinx.benchmark.Scope
67
import kotlinx.benchmark.State
78

89
@State(Scope.Benchmark)
910
class ULIDBenchmark {
1011
@Benchmark
11-
fun generateULID() {
12-
ULID.generate()
12+
fun generateULID(bh: Blackhole) {
13+
bh.consume(ULID.generate())
14+
}
15+
16+
@Benchmark
17+
fun generateULIDString(bh: Blackhole) {
18+
bh.consume(ULID.generate().toString())
19+
}
20+
21+
@Benchmark
22+
fun generateInsecureRandomULID(bh: Blackhole) {
23+
bh.consume(ULID.generate(secureRandom = false))
24+
}
25+
26+
@Benchmark
27+
fun generateInsecureRandomULIDString(bh: Blackhole) {
28+
bh.consume(ULID.generate(secureRandom = false).toString())
1329
}
1430
}
Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package dev.phillipslabs.kulid.benchmark
22

33
import kotlinx.benchmark.Benchmark
4+
import kotlinx.benchmark.Blackhole
45
import kotlinx.benchmark.Scope
56
import kotlinx.benchmark.State
67
import kotlin.uuid.ExperimentalUuidApi
@@ -10,8 +11,13 @@ import kotlin.uuid.Uuid
1011
class UUIDBenchmark {
1112
@OptIn(ExperimentalUuidApi::class)
1213
@Benchmark
13-
fun generateUUID() {
14-
// right now, ULID encodes to string on creation
15-
Uuid.random().toString()
14+
fun generateUUID(bh: Blackhole) {
15+
bh.consume(Uuid.random())
16+
}
17+
18+
@OptIn(ExperimentalUuidApi::class)
19+
@Benchmark
20+
fun generateUUIDString(bh: Blackhole) {
21+
bh.consume(Uuid.random().toString())
1622
}
1723
}

kulid/src/commonMain/kotlin/dev/phillipslabs/kulid/ULID.kt

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import kotlinx.serialization.Serializable
88
import org.kotlincrypto.random.CryptoRand
99
import kotlin.jvm.JvmInline
1010
import kotlin.math.absoluteValue
11+
import kotlin.random.Random
1112

1213
// some of these are marked as internal so that tests can be conducted easier
1314
// ideally, they would all be private unless there's a compelling reason to expose these
@@ -46,7 +47,10 @@ public value class ULID private constructor(
4647
public val MAX: ULID = fromString("7ZZZZZZZZZZZZZZZZZZZZZZZZZ")
4748
public val MIN: ULID = fromString("00000000000000000000000000")
4849

49-
public fun generate(timestamp: Long = Clock.System.now().toEpochMilliseconds()): ULID {
50+
public fun generate(
51+
timestamp: Long = Clock.System.now().toEpochMilliseconds(),
52+
secureRandom: Boolean = true,
53+
): ULID {
5054
check(timestamp >= 0L) { "Time must be non-negative" }
5155
check(timestamp <= MAX_TIME) { "Time must be less than $MAX_TIME" }
5256

@@ -56,7 +60,14 @@ public value class ULID private constructor(
5660
buf.writeShort((timestamp shr 32).toShort())
5761
buf.writeInt(timestamp.toInt())
5862

59-
val randomness = CryptoRand.Default.nextBytes(ByteArray(RANDOM_BYTE_SIZE))
63+
val randomness =
64+
if (secureRandom) {
65+
CryptoRand.Default.nextBytes(
66+
ByteArray(RANDOM_BYTE_SIZE),
67+
)
68+
} else {
69+
Random.nextBytes(ByteArray(RANDOM_BYTE_SIZE))
70+
}
6071
buf.write(randomness)
6172

6273
return ULID(buf.readByteString())

0 commit comments

Comments
 (0)