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

有大佬用过 Python 版本的雪花算法生成 id 吗?我在网上找到的版本,随机生成产生重复的概率太大了

  •  
  •   kayseen · 2020-04-02 17:21:57 +08:00 · 4485 次点击
    这是一个创建于 1456 天前的主题,其中的信息可能已经有所发展或是发生改变。
    21 条回复    2020-04-08 14:56:43 +08:00
    kayseen
        1
    kayseen  
    OP
       2020-04-02 17:25:30 +08:00
    我是单机使用, 如果两个用户在同一毫秒申请这个编码,因为依赖时间的关系是一定会重复吗?
    aec4d
        2
    aec4d  
       2020-04-02 17:33:06 +08:00 via iPhone
    都懒得看 CSDN 就知道怎么回事儿。理解原理才行,是不可能重复的,除非是多线程,多进程或者分布式环境,这种情况并发高一定会有重复。可以搞一个中心化发号器杜绝重复
    MinQ
        3
    MinQ  
       2020-04-02 17:35:32 +08:00
    @kayseen 是的,多线程的话可能会导致 count 出现脏读脏写,建议给 count 加锁
    MinQ
        4
    MinQ  
       2020-04-02 17:36:30 +08:00
    @aec4d 单机用加个锁拉倒了吧?
    banxi1988
        5
    banxi1988  
       2020-04-02 17:40:06 +08:00   ❤️ 2
    推荐一个视频 ,对 snowflake 算法有说明. Python 实现的.
    https://www.bilibili.com/video/BV1TJ411D7Cw/
    lhx2008
        6
    lhx2008  
       2020-04-02 17:59:13 +08:00 via Android
    这玩意肯定是在 pip 或者 github 上面找个多人用的库
    gclm
        7
    gclm  
       2020-04-02 19:03:37 +08:00 via Android
    时钟回拨。确实会重复,可以其他算法生成 ID
    superrichman
        8
    superrichman  
       2020-04-02 19:13:28 +08:00 via iPhone
    可以考虑用 redis 的 incr 来生成 id
    keshawnvan
        9
    keshawnvan  
       2020-04-02 19:21:13 +08:00
    你可以参考一下我的实现,有解决时钟回拨
    https://www.yuque.com/kaixiang-jinoo/gtspek/mft5gx
    kayseen
        10
    kayseen  
    OP
       2020-04-02 21:39:43 +08:00 via Android
    @keshawnvan 刚看了下你写的几篇文章真太好了,可惜看不懂 JAVA😔。。。
    kayseen
        11
    kayseen  
    OP
       2020-04-02 21:41:10 +08:00 via Android
    @superrichman
    谢谢提供思路,之前有考虑过,觉得雪花算法不依赖数据库挺好的哈哈
    kayseen
        12
    kayseen  
    OP
       2020-04-02 21:41:26 +08:00 via Android
    @aec4d
    嗯嗯,谢谢回复
    kayseen
        13
    kayseen  
    OP
       2020-04-02 21:42:28 +08:00 via Android
    @banxi1988
    十分感谢!这个视频讲的确实很不错,学习了!
    kayseen
        14
    kayseen  
    OP
       2020-04-02 21:43:26 +08:00 via Android
    @lhx2008
    唉,说起来你可能不信,我在 github 上没有找到 python 版本用的人多的
    kayseen
        15
    kayseen  
    OP
       2020-04-02 21:44:08 +08:00 via Android
    @gclm
    找了好久都是推荐雪花算法,请问还有其他什么方案生成啊?
    keshawnvan
        16
    keshawnvan  
       2020-04-03 10:52:13 +08:00
    @kayseen 看懂原理自己实现以下就可以了
    TransAM
        17
    TransAM  
       2020-04-03 14:03:11 +08:00 via Android
    不加锁也可以,每个线程维护自己的计数器,机器 id 后面插入 tid 。
    cz5424
        18
    cz5424  
       2020-04-04 19:40:48 +08:00
    上线至今没遇到重复的
    kayseen
        19
    kayseen  
    OP
       2020-04-07 19:53:11 +08:00
    @cz5424
    请问你用的版本是哪个啊, 在网上找到版本重复概率好高===
    rogwan
        20
    rogwan  
       2020-04-08 07:42:36 +08:00 via iPhone
    可以考虑下 short uuid
    lolizeppelin
        21
    lolizeppelin  
       2020-04-08 14:56:43 +08:00
    真服了你们了 这么简单一个算法 自己随便折腾下就知道了

    这玩意你完全可以根据自己需要改造一下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4537 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 10:07 · PVG 18:07 · LAX 03:07 · JFK 06:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.