C#(.Net)平台下生成随机数方法的小结

3 篇文章 0 订阅

最近在做一些工作,需要用到一些随机数来确保生出出来的串号唯一。

开始,很简单地使用System.Random类来生成随机数。很快,问题就来了,发现当random的生成间隔小于1ms时,随机数就重复了(仅限于每次都新建Random对象),因为新建random时候是默认以当前时间作为随机种子的。将random改为单例,重复数的几率小了,但是随机数在一段时间后循环了(伪随机数嘛,没办法,要求不了这么多的)。

所以,特意在网上找了一些资料,并亲自作了一些性能比较,在此作些总结。

  1. System.Random

    这个是伪随机数生成器

    缺点:生成出来的结果会循环,且Random对象创建间隔小于1ms的时候产生结果会相同;
    优点:生成速度极快;
    效率:高,同一个对象产生1,000,000个结果只需要22ms(不含对象创建时间)


  2. System.Security.Cryptography.RandomNumberGenerator

    这个是用于产生密码的安全随机数生成器,产生出来的随机数离散度高,产生1,000,000个32位(8-byte)的随机数无重复

    缺点:速度很慢,对比System.Random是两个数量级的效率差距;
    优点:安全度高,产生的结果可看作环境无关,而且可以填充任意长度的字节数组;
    效率:低,同一个对象产生1,000,000个结果需要4221ms(不含对象创建时间)


  3. System.Guid

    这个是GUID(UUID)生成器,出来的是128-bit的字节数组,通常被表示为8-4-4-4-12的32个hex字符。

    缺点:生成长度一定,而且生成出来的结果可能与环境相关,在高安全需求的环境不适用;
    优点:有强大的数学理论支持,在每秒产生10亿笔UUID的情况下,100年后只产生一次重复的机率是50%;
    效率:中,产生1,000,000个结果需要255ms(包含Guid对象创建时间)


以上3个都可以当作随机数产生器,但相对于大部分的业务需求, GUID(UUID)已经适用,而且其碰撞几率在同一个系统内几乎是不可能的。所以在选择产生器时GUID是一个不错的选择。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值