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

时间:2013-05-25 10:05:28

标签: 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")))))

哪个产生

KYFL0-7YO6J-30XMV-ZIGE7-MK009
MNQZH-K7L8I-35C0K-7DS7Q-OTZWI
MVB9D-GHME9-IMGCL-YPAKX-4YZVD
... etc

但是,它需要大约5秒钟,与类似的命令式算法相比,它相对较长。

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

2 个答案:

答案 0 :(得分:5)

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

  • 使用预先分配的(char-array 29)
  • 构建密钥
  • 使用aset设置数组中每个位置的字符
  • 使用randomz获取非常快的随机数(比java.util.Random快约150%)
  • 使用.charAt查找字符,例如像(.charAt "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" (int (Rand/r 36)))
  • 之类的东西
  • 使用dotimes作为循环 - 这通常比映射/任何序列
  • 更快

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

答案 1 :(得分:0)

如果你想获得最大的性能,我认为你不会比在Java中编写这个函数,并从Clojure调用它更好。或者,如果您想留在Clojure中,可以使用aset填充Java char数组,并使用(String. array)将它们转换为字符串。我认为这不是真正的“惯用”Clojure,但它会很快。