我是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秒钟左右的时间,与类似的命令式算法相比,它的时间相对较长。

什么是惯用的(快速的)方法来做我想做的事情?

最佳答案

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

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

    如果执行上述所有操作,您将获得非常高效的代码,可能与使用纯Java编写代码时一样快。

    关于clojure - 生成随机字符串的最快方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16748447/

    10-12 06:48