首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何生成可以在Clojure中使用test.check的UUID

如何生成可以在Clojure中使用test.check的UUID
EN

Stack Overflow用户
提问于 2015-01-30 23:11:33
回答 2查看 1.7K关注 0票数 1

生成测试似乎很有趣,但我需要生成随机UUID作为测试的一部分。对于test.check收缩,java.util.UUID/newRandom不太好。

java代码如下所示:

代码语言:javascript
复制
public static UUID randomUUID()
{
  long lsb = r.nextLong();
  long msb = r.nextLong();

  lsb &= 0x3FFFFFFFFFFFFFFFL;
  lsb |= 0x8000000000000000L; // set top two bits to variant 2

  msb &= 0xFFFFFFFFFFFF0FFFL;
  msb |= 0x4000; // Version 4;

  return new UUID( msb, lsb );
}

把它翻译成Clojure比看起来要难。

如何在Clojure中编写一个可以成功缩小的随机UUID函数?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-30 23:11:33

一个fn需要两个长,并生成一个正确的类型4UUID,它是:

代码语言:javascript
复制
(defn make-uuid [[msb lsb]]
  (java.util.UUID. (-> msb
                   (bit-clear 15)
                   (bit-set   14)
                   (bit-clear 13)
                   (bit-clear 12))
               (-> lsb
                   (bit-set   63)
                   (bit-clear 62))))

您可以使用regex来检查结果(首先需要将其转换为字符串)。

代码语言:javascript
复制
(def uuid-v4-regex
     #"(?i)[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[98ab][a-f0-9]{3}-[a-f0-9]{12}")

然后,您可以按以下方式进行测试:

代码语言:javascript
复制
(def uuids (gen/fmap make-uuid (gen/tuple (gen/choose 0 Long/MAX_VALUE)
                                          (gen/choose 0 Long/MAX_VALUE))))

(defspec check-random-uuid 100000
  (for-all [uuid uuids]
       (re-find uuid-v4-regex (str uuid))))

这些测试看起来是:

代码语言:javascript
复制
(check-random-uuid)
=> {:result true, :num-tests 100000, :seed 1422050154338}

只是为了好玩,我删除了第二个字段中的一个有效字符(9),这就是失败测试的样子,所以您可以看到从:fail :smallest可以有多大帮助。

代码语言:javascript
复制
(pp/pprint (check-random-uuid))
{:result nil,
 :seed 1422050276824,
 :failing-size 2,
 :num-tests 3,
 :fail [#uuid "2c6d1442-eec3-4800-972e-02905c1b3c00"],
 :shrunk
 {:total-nodes-visited 932,
  :depth 29,
  :result nil,
  :smallest [#uuid "00000000-0000-4000-9000-000000000000"]}}

这显示了从测试用例中可以消除多少噪声收缩。

票数 4
EN

Stack Overflow用户

发布于 2015-12-29 01:08:54

在test.check版本0.9.0中,有一个内置gen/uuid,它生成不收缩的随机uuids。

如果您确实希望缩小UUIDs,那么Generate2-long s方法也会更容易一些,因为新的gen/large-integer将生成全部范围的longs,尽管不是一个统一的分布。

仍然没有一个内置的生成器能够在所有的时间内产生一个均匀的分布,但是我认为这是将来应该增加的东西。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28246155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档