Uuids.kt
package com.hexagonkt.core
import com.hexagonkt.core.text.decodeBase64
import com.hexagonkt.core.text.encodeToBase64
import java.nio.ByteBuffer
import java.util.*
// TODO UUIDv7: https://antonz.org/uuidv7/?ref=dailydev#kotlin
/*
import java.security.SecureRandom
import java.time.Instant
object UUIDv7 {
private val random = SecureRandom()
fun generate(): ByteArray {
// random bytes
val value = ByteArray(16)
random.nextBytes(value)
// current timestamp in ms
val timestamp = Instant.now().toEpochMilli()
// timestamp
value[0] = ((timestamp shr 40) and 0xFF).toByte()
value[1] = ((timestamp shr 32) and 0xFF).toByte()
value[2] = ((timestamp shr 24) and 0xFF).toByte()
value[3] = ((timestamp shr 16) and 0xFF).toByte()
value[4] = ((timestamp shr 8) and 0xFF).toByte()
value[5] = (timestamp and 0xFF).toByte()
// version and variant
value[6] = (value[6].toInt() and 0x0F or 0x70).toByte()
value[8] = (value[8].toInt() and 0x3F or 0x80).toByte()
return value
}
@JvmStatic
fun main(args: Array<String>) {
val uuidVal = generate()
uuidVal.forEach { b -> print("%02x".format(b)) }
println()
}
}
*/
// TODO Rename to Ids.kt and support other algorithms (nanoid, ulid, snowflake, cuid)
/**
* [TODO](https://github.com/hexagontk/hexagon/issues/271).
*
* @receiver .
* @return .
*/
fun UUID.bytes(): ByteArray =
ByteBuffer.wrap(ByteArray(16)).let {
it.putLong(this.mostSignificantBits)
it.putLong(this.leastSignificantBits)
it.array()
}
/**
* [TODO](https://github.com/hexagontk/hexagon/issues/271).
*
* @receiver .
* @return .
*/
fun UUID.toBase64(): String =
bytes().encodeToBase64()
/**
* [TODO](https://github.com/hexagontk/hexagon/issues/271).
*
* @param text .
* @return .
*/
fun uuid(text: String): UUID =
if (text[8] == '-') UUID.fromString(text)
else uuid(text.decodeBase64())
/**
* [TODO](https://github.com/hexagontk/hexagon/issues/271).
*
* @param bytes .
* @return .
*/
fun uuid(bytes: ByteArray): UUID =
ByteBuffer.wrap(bytes).let { UUID(it.long, it.long) }