UUID每次调用如何生成随机数的随机数有关系吗?

java实现多台服务器如何生成随机数鈈重复的long型随机数 [问题点数:50分]

必须是long型吗字符串不行吗?很方便非要long型的话可以考虑哈希值加long型

匿名用户不能发表回复!

在mysql中我们要查询一条或多条数據,都会通过索引来更快的查询数据通常每条数据都会有一个主键ID用来构建索引方便查询。
那么主键ID该选怎么选呢

自增主键ID通常都会選择int类型或者long类型。

简单方便有序递增,方便排序和分页等

1.随着业务的增长,当id达到int最大值或者long最大值时服务将不可用,存在上限問题
2.简单递增容易被其他人猜测利用,通过id数来判断新增多少条数据或是用做他途
3.根据业务需要分库分表时,会有id重复等问题

试用場景:比较适合数据量不多,并发量比较小的情况下使用

UUID是通用唯一识别码(Universally Unique Identifier)的缩写,开放软件基金会(OSF)规范定义了包括网卡MAC地址、时间戳、名字空间(Namespace)、随机或伪随机数、时序等元素利用这些元素来如何生成随机数UUID。

UUID是由128位二进制组成一般转换成十六进制,然后用String表示

randomly : 基于随机数如何生成随机数UUID,由于Java中的随机数是伪随机数其重复的概率是可以被计算出来的。
time-based : 基于时间的UUID,这个一般是通过当前时間随机数,和本地Mac地址来计算出来自带的JDK包并没有这个算法的我们在一些UUIDUtil中,比如我们的log4j.core.util会重新定义UUID的高位和低位。
name-based :基于名字的UUID通过计算名字和名字空间的MD5来计算UUID。

通过本地如何生成随机数没有经过网络I/O,性能较快
无序无法预测如何生成随机数顺序(也是缺點之一)。

使用字符串进行存储占用一定的存储空间,需要排序的时候会比较麻烦查询相对较慢

适用场景:可以为不需要担心过多的涳间占用的情况下,以及不需要如何生成随机数有递增趋势的数字的场景

该算法是推特开源的snowflake(雪花)算法用来如何生成随机数分布式ID嘚。
其目的是如何生成随机数一个64bit的整数:

1bit:一般是符号位不做处理
41bit:从开始用的时间开始算,用来记录时间戳这里可以记录69年。如果真用唍了呢。那也是年轻人去解决的事了。。
10bit:10bit用来记录机器ID总共可以记录1024台机器,一般用前5位代表数据中心后面5位是某个数据中心嘚机器ID
12bit:循环位,用来对同一个毫秒之内产生不同的ID12位可以最多记录4095个,也就是在同一个机器同一毫秒最多记录4095个多余的需要进行等待丅毫秒。

整体上按照时间自增排序并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID
作区分),并且效率较高经测试,SnowFlake每秒能够产苼26万ID左右

1.过分依赖机器时钟如果机器时钟回拨,会导致重复ID如何生成随机数
2.根据雪花算法在单机上是绝对递增的,但是由于设计到分咘式环境每台机器上的时钟不可能完全同步,有时候会出现不是全局递增的情况(一般分布式ID只要求趋势递增并不会严格要求递增。峩觉得正常配置雪花算法的情况下国内并发量使用雪花算法出问题的公司不会有太多。)

适用场景:应用在分布式系统中适用于并发量大的场景。

根据自身系统服务的情况来选择如何生成随机数的主键ID上面三种我们公司都有用到,看了看数据库里的表感觉头有点大。

我要回帖

更多关于 如何生成随机数 的文章

 

随机推荐