V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
kayseen
V2EX  ›  Python

生成 16 位长度的数字+字母编码组合,如果不使用保存 mysql 时设置 unique,怎么在生成的过程中确保唯一呢?

  •  
  •   kayseen · 2020-02-25 17:04:13 +08:00 · 3687 次点击
    这是一个创建于 1767 天前的主题,其中的信息可能已经有所发展或是发生改变。
    20 条回复    2020-02-28 16:53:18 +08:00
    kayseen
        1
    kayseen  
    OP
       2020-02-25 17:06:48 +08:00
    比如年前的支付宝的福卡,每张卡都有一个大概 8 位长度的编码,且保证编码唯一,组合的可能性肯定超过需要的数量,但是对于重复性的处理是咋搞的啊
    shintendo
        2
    shintendo  
       2020-02-25 17:08:19 +08:00
    参考 uuid 原理
    Varobjs
        3
    Varobjs  
       2020-02-25 17:27:26 +08:00 via Android
    13 位时间戳,map 映射定义好的字母表,➕几个随机字母数字
    lxml
        4
    lxml  
       2020-02-25 17:30:21 +08:00
    mini 版 雪花算法啊
    janxin
        5
    janxin  
       2020-02-25 17:31:22 +08:00
    搜索关键词“分布式 唯一 ID”
    littlewing
        6
    littlewing  
       2020-02-25 17:32:59 +08:00
    分布式唯一 ID 生成器
    loginbygoogle
        7
    loginbygoogle  
       2020-02-25 18:39:28 +08:00 via iPhone
    多此一举
    mostkia
        8
    mostkia  
       2020-02-25 19:14:08 +08:00
    我生成唯一 id 的算法是一般都是 MD5 (时间戳+盐)
    虽然依旧有极小概率会出现重复,但我感觉我的一生里应该不会碰到一次,所以没必要太过纠结
    formatex
        9
    formatex  
       2020-02-25 21:27:19 +08:00 via Android
    不要求随机性的话这样:
    0000
    0001
    ....
    aaaa
    aaab
    aaac
    hihipp
        10
    hihipp  
       2020-02-25 23:28:42 +08:00
    时间戳 + 用户标识,用 16 位 MD5 摘要算法。
    cmdOptionKana
        11
    cmdOptionKana  
       2020-02-26 00:11:17 +08:00
    RedisMasterNode
        12
    RedisMasterNode  
       2020-02-26 00:30:13 +08:00
    xuanbg
        13
    xuanbg  
       2020-02-26 07:19:45 +08:00
    @mostkia
    @hihipp 你们这个不行啊,同一毫秒有两个请求咋办呀?

    如果不能通过算法保证唯一性,那就只能通过查表保证唯一性了。。。
    melkor
        14
    melkor  
       2020-02-26 08:38:56 +08:00 via iPhone
    @xuanbg 时间戳加序列号加随机数,碰撞概率足够低即可。真的遇上碰撞就重试。先查表没用,并发问题一样有。
    BlackBerry999
        15
    BlackBerry999  
       2020-02-26 09:41:29 +08:00
    雪花算法生成 ID 靠谱一点
    vevlins
        16
    vevlins  
       2020-02-26 09:56:28 +08:00
    自荐一下文章:分布式唯一 ID https://juejin.im/post/5e43b22251882549361e4be4,不过如果单表就是脱裤子放屁了,设置 unique + 随便一个随机算法成本最小。
    ps1aniuge
        17
    ps1aniuge  
       2020-02-26 13:41:06 +08:00
    使用 [使用保存 mysql 时设置 unique]即可呀。设置 unique + 随便一个随机算法成本最小。
    楼上正解。
    zunceng
        18
    zunceng  
       2020-02-26 13:45:36 +08:00
    snowflake + base58
    mostkia
        19
    mostkia  
       2020-02-26 15:05:08 +08:00
    @xuanbg 没看到有盐嘛,单纯时间戳自然不太可靠的。加点佐料啊,哈哈
    xpdoh
        20
    xpdoh  
       2020-02-28 16:53:18 +08:00
    base36,时间戳 x7//2020 年起约 120 年,间隔 50 毫秒,随机码 x9//约 10^15 种可能,共 16 位

    这是我的方案,又短又不会冲突,能用 120 年,就是这么自信
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1108 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 18:56 · PVG 02:56 · LAX 10:56 · JFK 13:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.