首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
V2EX  ›  问与答

生成 8 位数字 作为用户的唯一主键, 如何保证唯一?

  •  
  •   mocxe2vwww · 254 天前 · 2452 次点击
    这是一个创建于 254 天前的主题,其中的信息可能已经有所发展或是发生改变。

    项目不考虑分布式, 但是上线之后,用户并发注册的情况会很大,而且要求不能用自增,数字不能包含 0

    时间成本有限,不能太复杂了,所以我想到最简单的方案: 每次直接程序内生成一个 8 位数,再去 user 表 for update 后找一下看有没有。

    还想到的一种方法:直接在 redis 队列中生成 100w 个均匀分布,每次 pop 一个

    大家有啥好的思路没?

    21 回复  |  直到 2018-12-12 14:39:02 +08:00
        1
    herozhang   254 天前 via iPhone   ♥ 2
    提前生成好,来一个激活一个
        2
    xern   254 天前 via Android
    GUID 了解一下
        3
    nightv2   254 天前 via Android
    @xern +1
        4
    herozhang   254 天前
    @xern lz 说了只要 8 位数字
        5
    bolide2005   254 天前   ♥ 1
    时间戳加随机数
        6
    egen   254 天前
    redis 的方案吧,for update 还是慢
        7
    mocxe2vwww   254 天前
    @xern 好吧,正好在看文档,https://docs.sqlalchemy.org/en/latest/core/custom_types.html

    uuid 转 int,截取后 8 位, 实验下
        8
    innoink   254 天前 via Android
    8 位是 1000w,这个量其实不小
        9
    innoink   254 天前 via Android
    @mocxe2vwww 截取能保证不重复么
        10
    innoink   254 天前 via Android
    如果不考虑完全随机

    可以每次拿一个区间,random shuffle 以后使用
    每次的区间不重叠就行了
        11
    john1989   254 天前 via Android
    线性同余法
        12
    580a388da131   254 天前 via iPhone
    排排队就好了,没必要弄那么复杂。
    短期注册量大也就大那一会而已。
        13
    leavan   254 天前
    平方探测
        14
    xenme   254 天前 via iPhone
    基于用户名是生成 hash,找找主流 hash 算法,改造下成 8 位就好。
        15
    swulling   254 天前 via iPhone
    看你的用户量了,不超过百万量级完全可以在 redis 里维护一个 id set,每次新用户注册随机生成一个,验证是否在 set 里,如果在重复生成即可。

    这个实现起来是最快的,只需要几行代码…
        16
    Zzdex   254 天前 via iPhone
    提前生成吧 1000w 不是很多啊
        17
    akira   253 天前
    这个要的应该是用户数字 id 吧,这个没必要和唯一主键挂钩啊.
    建议用户表还是用自增字段做唯一主键,另外创建一个表是 自增 id->user_id 映射关系表,提前填写好数据,这样创建新用户的时候,sql 里面直接写就好了.
        18
    kernel   253 天前   ♥ 1
    看这情况这只是个个人小项目,你会有 1000 万用户吗? 10w 顶多了吧,提前生成 10w 就行了。真有 10w 用户了再生成下一批。
        19
    700388   253 天前
    太简单了吧,直接随机生成 8 位数字,再匹配是否生成过,没有生成过,就完事,生成过,在生成一次匹配。
        20
    adgad2   253 天前
    有同样的需求、、、用的 redis 的做法,提前生成好,然后取
        21
    mocxe2vwww   253 天前
    @akira 你这方法感觉简单实用
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1752 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 22ms · UTC 16:25 · PVG 00:25 · LAX 09:25 · JFK 12:25
    ♥ Do have faith in what you're doing.