生成随机字符串的最快方法

cyr*_*rus 9 clojure

我是Clojure和函数式编程的新手.我想以下列格式创建100,000个密钥列表:XXXXX-XXXXX-XXXXX-XXXXX-XXXXX

我做这样的事情:

(defn get-key [chunk-size, key-length] 
 (apply str 
  (flatten
   (interpose "-" 
    (partition chunk-size 
     (take key-length 
      (repeatedly #(rand-nth "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"))))))))

(defn dump-keys [n, chunk-size, key-length] 
 (with-open [wrt (io/writer "keys.txt")]
  (doseq [i (range n)]
   (.write wrt (str (get-key chunk-size key-length) "\n")))))
Run Code Online (Sandbox Code Playgroud)

哪个产生

KYFL0-7YO6J-30XMV-ZIGE7-MK009
MNQZH-K7L8I-35C0K-7DS7Q-OTZWI
MVB9D-GHME9-IMGCL-YPAKX-4YZVD
... etc
Run Code Online (Sandbox Code Playgroud)

然而,它需要大约5秒,与类似的命令式算法相比,这相对较长.

什么被认为是做我想做的事情的惯用(和快速)方式?

mik*_*era 5

为了获得最大速度,我建议采用以下技术:

  • 使用预分配构造密钥 (char-array 29)
  • 用于aset在数组中的每个位置设置字符
  • 使用randomz可以得到非常快的随机数(大约快150%java.util.Random)
  • 查找角色.charAt,例如(.charAt "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" (int (Rand/r 36)))
  • 使用dotimes你的循环-这是一般比序列映射/任何更快

如果你完成上述所有工作,你应该得到非常高效的代码,可能与你在纯Java中编写代码一样快.