惊呆了,看到公司内部系统的生成数据库主键 ID 的代码以后,我的三观毁了。内附 Python 代码

2021-04-25 18:29:36 +08:00
 0x0208v0

import random


class IDGenerator:
    @classmethod
    def gen_primary_id(cls, length=11):
        prefix = random.choice('123456789')
        return prefix + ''.join([random.choice('0123456789')
                                 for i in range(length)])

据说系统运行了几年,没碰见过碰撞的情况。我感觉我数学没学好,谁能告诉我这是哪一块的知识

13671 次点击
所在节点    程序员
101 条回复
Jooooooooo
2021-04-25 19:34:49 +08:00
可以用抛唯一键冲突重试的方法解决
sillydaddy
2021-04-25 19:47:44 +08:00
@snw #6
概率应该比百万分之一高多了。对应的概率计算参考“生日问题”:

https://zh.m.wikipedia.org/wiki/%E7%94%9F%E6%97%A5%E5%95%8F%E9%A1%8C

我估计生成 10 万个 id 发生碰撞的概率应该大于千分之一。
jeffwcx
2021-04-25 20:43:24 +08:00
哈哈,这还不如 uuid 呢,如果需要 id 的顺序性可以用 snowflake
snw
2021-04-25 20:51:39 +08:00
@sillydaddy
我刚才公式拉错了。用 excel 又模拟了一遍,10 万个 id 碰撞概率大约 4.877%。
mind3x
2021-04-25 21:02:59 +08:00
@sillydaddy 根据近似公式 1-1/exp(n^2/(2N)),n=10 万,N=900000000000,概率大于千分之 5 了。
0x0208v0
2021-04-25 21:05:03 +08:00
@mind3x 太秀了,请问怎么学这个公式,哪本书上有
mind3x
2021-04-25 21:06:42 +08:00
@v2exblog 就在 @sillydaddy 贴过的 Wikipedia 连接里
pkupyx
2021-04-25 21:28:29 +08:00
也许数据库上有唯一索引重复就回滚吧
jdandelion573
2021-04-25 22:09:40 +08:00
说明数据库没人用
ila
2021-04-25 22:13:32 +08:00
要看其它代码
ytmsdy
2021-04-25 22:47:36 +08:00
冲突肯定是发生过的,只不过无法复现罢了!
lightingtime
2021-04-26 00:07:31 +08:00
判断一下使用场景啊,qps 如果只有几,那么碰撞了就重新生成 a
george404
2021-04-26 08:01:09 +08:00
不得不佩服,大道至简,哈哈!!
auh
2021-04-26 08:12:32 +08:00
这一看就是组长干的事情。往往小兵在没有征得老大同意的情况下,是不敢这样操作的。
wunsch0106
2021-04-26 08:48:31 +08:00
我甚至觉得这是个段子
jetyang
2021-04-26 08:50:29 +08:00
重复了会插入报错,报错就再生成一个,大家不都是这么做的吗?抠鼻
LudwigWS
2021-04-26 08:55:45 +08:00
@snw excel 自己连 uuid 都没有,编程太不友好了。vba 很垃圾……
securityCoding
2021-04-26 08:57:18 +08:00
233 还不如直接时间戳呢
dangyuluo
2021-04-26 08:58:52 +08:00
虽然代码很烂,但是公布自己就职公司的代码(勉强算得上是算法)好么?
soulzz
2021-04-26 09:00:16 +08:00
赶紧跑路

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/773177

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX