如何在Clojure中生成固定长度的随机密码?

时间:2014-11-21 03:42:23

标签: clojure

是否有快速生成固定长度的随机密码? (例如,8位数,字母/数字/下划线)

4 个答案:

答案 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.securityapache-commons。请查看代码!它太小了。

特别是在您的情况下,您可能正在寻找hex函数,因此解决方案将是:(crypto.random/hex size)