- 生成8位长度数字UID
- 非递增,无规律
- 唯一性
目前想到的方案
- 提前生成一堆UID,随机抽取
- 写入UID前随机生成,判断是否存在
但这两种方案都需要提前查询下数据库,请问有没有效率更高的?
类似生成QQ号的算法?
目前想到的方案
但这两种方案都需要提前查询下数据库,请问有没有效率更高的?
类似生成QQ号的算法?
可以参考雪花算法,但是雪花算法是64位,8位十进制数最大27位太短了
所以还是需要根据具体业务场景决定怎么做,需要考虑的问题包括但不限于:
所以最简单有效的方法还是数据里先乱序存好这些id,然后随用随取。。。
我一开始也是想到了雪花算法,但是仔细想了想还是有很多不足,雪花算法虽然不重复,但是它根据时间戳就必然导致他是有递增趋势的,而且不是连续递增,就可能存在漏掉一些id。比如第一次生成10000000,第二次生成10000003,那中间的数就相当于丢了,而且这种算法在一秒内提供的id数量是有限的。用时间戳的话,因为99999999对应的二进制是101 1111 0101 1110 0000 1111 1111,如果生成的时间戳如果是全1的话,就有可能导致最终结果大于1亿。如果不在乎这些个问题,那确实可以用。
剩下的方式,感觉还是提前生成大量号码,存数据库。每次提取一批号码到内存中,效果和效率应该都还行。
本身因为位数太少,不好保证唯一性,因为按现在计算机处理速度,就是在1秒以内,这么多UID也肯定用完的,这就有了冲突。
如果不建议冲突,其实有一种取巧的方法,大致思路是:
比如一个时候的A值是[0,1,2,3,4,5,6,7,8,9],则源UID值12345678对应的UID就是12345678,
但同样的源值,在A值为[0,9,8,7,6,5,4,3,2,1],时,对应的UID变成98765432了。
这个算法的好处是不需要查表(雪花算法需要查表比较),而且在一定时间内肯定可以保证唯一性(A不变情况下)
不过具体哪个算法更合适你,其实还要考虑真实的应用场景关键目的是什么,为什么需要这个数据(即这个数据到底是用来干什么的)
如果不是只能用数字字符,则8位字符串(排除一些相似字符比如0
和o
,1
和l
之类),可用空间更多。
15 回答8.4k 阅读
8 回答6.2k 阅读
4 回答4.4k 阅读✓ 已解决
5 回答3.2k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
4 回答4k 阅读
1 回答3k 阅读✓ 已解决
先生成一大堆uid 并标记status=0,然后sql 随机查询1条status=0的,使用并标记为status=1