是否有快速生成固定长度的随机密码? (例如,8位数,字母/数字/下划线)
答案 0 :(得分:12)
user> (defn fixed-length-password
([] (fixed-length-password 8))
([n]
(let [chars (map char (range 33 127))
password (take n (repeatedly #(rand-nth chars)))]
(reduce str password))))
#'user/fixed-length-password
user> (fixed-length-password 10)
;=> "N&L[yyLUI4"
user> (fixed-length-password 10)
;-> "8JSF-:?si."
user> (fixed-length-password 10)
;=> "EbKS~?*J*h"
答案 1 :(得分:3)
user> (defn fixed-length-password
([] (fixed-length-password 8))
([n]
(let [chars-between #(map char (range (int %1) (inc (int %2))))
chars (concat (chars-between \0 \9)
(chars-between \a \z)
(chars-between \A \Z)
[\_])
password (take n (repeatedly #(rand-nth chars)))]
(reduce str password))))
#'user/fixed-length-password
user> (fixed-length-password 10)
;=> "Pfm0hwppMr"
user> (fixed-length-password 10)
;-> "n6lQoz_KGd"
user> (fixed-length-password 10)
;=> "vCkubQR75Z"
这是runexec答案的一个细微变化,您可以在其中看到如何选择随机字符串应使用的字符。
答案 2 :(得分:2)
(defn rand-string [characters n]
(->> (fn [] (rand-nth characters))
repeatedly
(take n)
(apply str)))
因为rand-nth有副作用,所以它不是确定性的,但它应该足以让你开始使用。
答案 3 :(得分:2)
您可能想要使用crypto-random
库。它由Compojure
的同一作者提供,适用于加密目的。
请注意,它包装了Java库(java.security
和apache-commons
。请查看代码!它太小了。
特别是在您的情况下,您可能正在寻找hex
函数,因此解决方案将是:(crypto.random/hex size)
。