Skip to content

Instantly share code, notes, and snippets.

@vonwenm
Forked from pyrtsa/millisquuid.clj
Created July 27, 2014 08:39
Show Gist options
  • Save vonwenm/546a58b5df22624501d5 to your computer and use it in GitHub Desktop.
Save vonwenm/546a58b5df22624501d5 to your computer and use it in GitHub Desktop.
(ns pyrtsa.millisquuid
(:import java.security.SecureRandom
java.util.Date
java.util.Random
java.util.UUID))
(def ^:private secure-random
(delay (java.security.SecureRandom.)))
(defn- ^Long rand-long
[]
(.nextLong ^java.util.Random @secure-random))
(defn- ^Boolean rand-boolean
[]
(.nextBoolean ^java.util.Random @secure-random))
(defn millisquuid
([] (millisquuid (System/currentTimeMillis)))
([millis]
{:pre [(<= 0 millis) (< millis (* 1000 0x100000000))]}
(let [q (-> millis (* 1024) (+ 999) (quot 1000))
p (inc q)
x (if (and (= (-> p (* 1000) (quot 1024))
(-> q (* 1000) (quot 1024)))
(rand-boolean))
p q)
hi (bit-or (bit-shift-left x 22)
(bit-and (rand-long) 0x3fffff))
lo (rand-long)]
(java.util.UUID. hi lo))))
(defn millisquuid-millis
^long [^java.util.UUID uuid]
(-> (.getMostSignificantBits uuid) (bit-shift-right 22) (* 1000) (quot 1024)))
(defn millisquuid-date
[uuid]
(java.util.Date. (millisquuid-millis uuid)))
user=> (millisquuid (System/currentTimeMillis))
#uuid "5356221e-d9bd-b0c0-fd7d-453847880c22"
user=> (millisquuid 0)
#uuid "00000000-0067-5be7-7469-f0c3b47f44cd"
user=> (millisquuid)
#uuid "53562257-f996-2386-8a9f-28cc27315cf7"
user=> (def uuid *1)
#'user/uuid
user=> (millisquuid-date uuid)
#inst "2014-04-22T08:03:35.974-00:00"
user=> (millisquuid-millis uuid)
1398153815974
user=> (datomic.api/squuid-time-millis uuid)
1398153815000
user=> (-> uuid millisquuid-millis millisquuid)
#uuid "53562257-f9b6-f9d4-6489-849b71bf4bf8"
user=> (dotimes [_ 25] (Thread/sleep 1) (println (millisquuid)))
#uuid "5356239a-a890-3fc5-3a93-1b9e279a844a"
#uuid "5356239a-a907-fa17-c756-915f2bbd9ae0"
#uuid "5356239a-a95b-5ded-6abe-e6b62e4adca2"
#uuid "5356239a-a9bb-e862-c70e-1f513bb952c8"
#uuid "5356239a-aa2e-f238-bdbe-1c987668795e"
#uuid "5356239a-aaa0-cd2e-f092-9dc1af46c444"
#uuid "5356239a-ab01-0a30-b0b8-4ba3e376eefe"
#uuid "5356239a-abad-517e-beac-78ec02ecaa23"
#uuid "5356239a-abfd-a050-1aae-c04c0094e7d3"
#uuid "5356239a-ac17-ae02-8ae0-83d9a433fb3a"
#uuid "5356239a-ac6d-211e-cd27-1b3baa3a74f6"
#uuid "5356239a-acea-0f61-8b89-a32b53280ed0"
#uuid "5356239a-ad19-d239-c321-5b540fc840d0"
#uuid "5356239a-ad99-d0c2-8035-9187ab35fe32"
#uuid "5356239a-adc7-7de5-dde5-971840283df5"
#uuid "5356239a-ae42-988c-f7b6-2e5fa305fd3e"
#uuid "5356239a-aea5-a56a-396f-73b0a60f695d"
#uuid "5356239a-af24-83bd-3175-7bfe9e104c76"
#uuid "5356239a-af77-a1e2-1d6f-7959300792c9"
#uuid "5356239a-afb6-8844-18c9-b7b5d893bf2f"
#uuid "5356239a-b02f-85de-386f-633adee6f781"
#uuid "5356239a-b06c-a98c-61da-6eef0a3f6b73"
#uuid "5356239a-b097-ccd3-3e48-3ec6dd3aca38"
#uuid "5356239a-b133-4e8a-bc9a-756c95abe426"
#uuid "5356239a-b17e-a310-8386-ac77f27b4ca8"
user=> (dotimes [_ 25] (Thread/sleep 1) (println (millisquuid-date (millisquuid))))
#inst "2014-04-22T08:09:19.547-00:00"
#inst "2014-04-22T08:09:19.548-00:00"
#inst "2014-04-22T08:09:19.550-00:00"
#inst "2014-04-22T08:09:19.551-00:00"
#inst "2014-04-22T08:09:19.553-00:00"
#inst "2014-04-22T08:09:19.554-00:00"
#inst "2014-04-22T08:09:19.556-00:00"
#inst "2014-04-22T08:09:19.557-00:00"
#inst "2014-04-22T08:09:19.559-00:00"
#inst "2014-04-22T08:09:19.560-00:00"
#inst "2014-04-22T08:09:19.562-00:00"
#inst "2014-04-22T08:09:19.563-00:00"
#inst "2014-04-22T08:09:19.565-00:00"
#inst "2014-04-22T08:09:19.567-00:00"
#inst "2014-04-22T08:09:19.568-00:00"
#inst "2014-04-22T08:09:19.569-00:00"
#inst "2014-04-22T08:09:19.571-00:00"
#inst "2014-04-22T08:09:19.573-00:00"
#inst "2014-04-22T08:09:19.574-00:00"
#inst "2014-04-22T08:09:19.575-00:00"
#inst "2014-04-22T08:09:19.577-00:00"
#inst "2014-04-22T08:09:19.578-00:00"
#inst "2014-04-22T08:09:19.580-00:00"
#inst "2014-04-22T08:09:19.581-00:00"
#inst "2014-04-22T08:09:19.582-00:00"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment