Skip to content

Commit

Permalink
Add sequential UUID support.
Browse files Browse the repository at this point in the history
  • Loading branch information
whilo committed May 11, 2017
1 parent e75b745 commit 658f591
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 2 deletions.
23 changes: 22 additions & 1 deletion src/hasch/core.cljc
Expand Up @@ -9,7 +9,10 @@
(def hash->str platform/hash->str)

(defn edn-hash
"Hash an edn value with SHA-512 by default or a compatible hash function of choice."
"Hash an edn value with SHA-512 by default or a compatible hash function of choice.
Please use the write-handlers only in legacy cases and rather extend the PHashCoercion
protocol to your own types."
([val] (edn-hash val {}))
([val write-handlers] (edn-hash val hasch.platform/sha512-message-digest write-handlers))
([val md-create-fn write-handlers]
Expand All @@ -24,3 +27,21 @@
structures."
([] (uuid4))
([val & {:keys [write-handlers]}] (-> val (edn-hash write-handlers) uuid5)))


(defn squuid
"Calculates a sequential UUID as described in
https://github.com/clojure-cookbook/clojure-cookbook/blob/master/01_primitive-data/1-24_uuids.asciidoc"
([] (squuid (java.util.UUID/randomUUID)))
([uuid]
(let [time (System/currentTimeMillis)
secs (quot time 1000)
lsb (.getLeastSignificantBits uuid)
msb (.getMostSignificantBits uuid)
timed-msb (bit-or (bit-shift-left secs 32)
(bit-and 0x00000000ffffffff msb))]
(java.util.UUID. timed-msb lsb))))




6 changes: 5 additions & 1 deletion test/hasch/test.cljc
@@ -1,5 +1,5 @@
(ns hasch.test
(:require [hasch.core :refer [edn-hash uuid]]
(:require [hasch.core :refer [edn-hash uuid squuid]]
[hasch.benc :refer [xor-hashes]]
[hasch.platform :refer [uuid5 sha512-message-digest hash->str]]
[incognito.base :as ic]
Expand Down Expand Up @@ -100,6 +100,10 @@
(is (= (hash->str (range 256))
"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"))))

(deftest squuid-test
(testing "Sequential UUID functionality."
(is (= (squuid (uuid [1 2 3]))
#uuid "5914da46-5c15-555e-a1c8-6166a78fc808"))))


#_(run-tests)
Expand Down

0 comments on commit 658f591

Please sign in to comment.