(defmacro bytes->hex-string [x]
`(javax.xml.bind.DatatypeConverter/printHexBinary ~x))
(defn- message-digest [algorithm ^String msg]
(-> (doto (java.security.MessageDigest/getInstance algorithm)
.reset
(.update (.getBytes msg)))
.digest
bytes->hex-string))
(def ^{:arglists '([^String msg])} md5
#(message-digest "md5" %))
(def ^{:arglists '([^String msg])} sha1
#(message-digest "sha1" %))
(def ^{:arglists '([^String msg])} sha256
#(message-digest "sha-256" %))
;;; usage
(require '[clojure.string :as str])
(map #(str/lower-case (% "abc")) [md5 sha1 sha256])
(comment
("900150983cd24fb0d6963f7d28e17f72"
"a9993e364706816aba3e25717850c26c9cd0d89d"
"ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad")
)