我正在研究具有以下约束的UniqueId提供程序的简单要求:
现在我的问题是为了在预先存在的id上测试与唯一用户名相关的第3点,我是否可以生成一组随机的Id,例如20或50,并断言它们都是唯一的?
我只是不相信这项测试会确保唯一性算法会在1,00,000个生成的ID中生成唯一ID。
请注意,我需要先按照TDD进行测试。
答案 0 :(得分:3)
考虑分离"唯一性"检查(即作为单独的对象)并单独测试 - 这样您就可以轻松地测试"随机生成的数字已被使用"通过嘲弄" IsUnique"检查。
用于测试唯一性检查 - 已知为非唯一值的提要(可能需要模拟已知的值"已知值和#34;)并确保它正确失败。
请注意使用"随机"如果现有项目的数量与所有选项的数量相当(即不能接受#34;洗牌卡牌"),则找到唯一ID可能会变得非常慢。自动递增数字/数据库字段更容易实现/证明正确性。
答案 1 :(得分:2)
基于计算随机ID所需的时间很长,您只需验证n
(n
接近1,000,000)它们都是唯一的。 20或50不足以确保1,000,000中的1的唯一性。
要对此进行实际测试,您可以跟踪之前对Randomizer
的调用,并声明每个新ID都不会被之前的任何ID重复。
此外,您似乎也可以使用GUID
。
答案 2 :(得分:1)
测试[伪]随机数生成器很难。关于该主题的一些资源。
http://csrc.nist.gov/groups/ST/toolkit/rng/documents/nissc-paper.pdf
http://www.drdobbs.com/testing-random-number-generators/184403185
http://www.johndcook.com/blog/2010/12/06/how-to-test-a-random-number-generator-2/
但是,为什么不直接使用系统提供的东西来找到你想去的地方?
据推测,您的数据存储在数据库中。
大多数数据库都提供了生成唯一的序列ID数字的工具。你可以使用它。
在C#或SQL(通常)中生成GUID非常独特和简单。
请注意,您的用户ID的域名为36 10 (0 - 3,656,158,440,062,975):您希望获得64位值,将其转换为long并将其模数为36 < sup> 10 来获取您的用户ID。
您还可以计算[盐渍]用户数据的加密哈希并执行相同的操作。
无论如何,您需要编码以便处理生成重复ID的情况。