Skip to content

Instantly share code, notes, and snippets.

@shoaib42
Created August 9, 2022 14:14
Show Gist options
  • Save shoaib42/fd7b9bee1cd65d5cdecf9f07bd3ea4b0 to your computer and use it in GitHub Desktop.
Save shoaib42/fd7b9bee1cd65d5cdecf9f07bd3ea4b0 to your computer and use it in GitHub Desktop.
Fast psuedo UUID generation in Scala
import java.util.concurrent.ThreadLocalRandom
import scala.annotation.tailrec
object FastUUID extends App {
val hex = "0123456789abcdef".toCharArray
def fastUUID(): String = {
val msbees = ThreadLocalRandom.current.nextLong()
val lsbees = ThreadLocalRandom.current.nextLong()
val sb = new StringBuilder(36)
@tailrec
def appendHex(l: Long, d: Int, acc: StringBuilder): Unit = {
if (d != 0) {
appendHex(l >> 4, d - 1, acc.append(hex((l & 0xf).toInt)))
}
}
appendHex(msbees, 8, sb)
sb.append("-")
appendHex(msbees >> 32, 4, sb)
sb.append("-")
appendHex(msbees >> 48, 4, sb)
sb.append("-")
appendHex(lsbees, 4, sb)
sb.append("-")
appendHex(lsbees >> 16, 12, sb)
sb.toString
}
def timeIt(method: => String): Long = {
val before = System.nanoTime()
for (_ <- 1 to 1000000) method
System.nanoTime() - before
}
timeIt(java.util.UUID.randomUUID().toString)
print("javaUUID timed : ")
val j = timeIt(java.util.UUID.randomUUID().toString)
println(j)
timeIt(fastUUID)
print("fastUUID timed : ")
val ft = timeIt(fastUUID)
println(ft)
println("javaUUID Time / fastUUID Time " + j.toDouble / ft)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment