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
honmaple
V2EX  ›  Python

怎样选择 uid 生成策略?

  •  
  •   honmaple · 2016-06-09 18:41:38 +08:00 · 7370 次点击
    这是一个创建于 3118 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我想问一下大家的 uid 是怎么生成的,uuid 有 32 位太长,目前的策略是时间戳+用户 ID+两位随机数

    def make_uid():
        a = str(int(time()))
        b = str(1).zfill(6)
        c = str(randint(10, 99))
        return a + b + c
    a = make_uid()
    print(a)
    
    

    但看了一下,有 18 位,感觉还是有些长,那么如何生成 10 位以内的不重复 uid 呢?

    38 条回复    2016-06-14 17:53:55 +08:00
    ZGLHHH
        1
    ZGLHHH  
       2016-06-09 18:43:21 +08:00 via Android
    uid 不是 user id 吗?我选择 MySQL 自增
    honmaple
        2
    honmaple  
    OP
       2016-06-09 18:52:06 +08:00
    额, uid 不是 url id 吗,假设不用自增 ID
    Ouyangan
        3
    Ouyangan  
       2016-06-09 18:54:56 +08:00 via Android
    一般使用 uuid,你提出这个问题的出发点在哪里,短了对你有什么帮助
    hxsf
        4
    hxsf  
       2016-06-09 19:32:13 +08:00 via Android
    写过一个短网址服务,一下是我的策略
    短网址说白了就是 k-v 。

    默认生成 key 长度为 6 ,然后查重,重复就长度+1 再生成,再重复再+1 。直到不重复。

    方法虽然 low ,但是可以确保不重复且始终有解。
    misaka19000
        5
    misaka19000  
       2016-06-09 19:33:33 +08:00 via Android
    搭个车问下类似于 V 站的这种 284656 是如何生成的?有没有知道的能解释下
    YUX
        6
    YUX  
       2016-06-09 19:35:11 +08:00
    uid 不是 unique ID 嘛
    murmur
        7
    murmur  
       2016-06-09 19:40:32 +08:00
    @misaka19000 自增主键吧?
    SourceMan
        8
    SourceMan  
       2016-06-09 19:44:21 +08:00 via iPhone
    你们想把你们公司对外宣传几千万用户,然而只有 10 多万而已的事实通过自增主键暴露出来吗
    popu111
        9
    popu111  
       2016-06-09 19:50:21 +08:00   ❤️ 1
    @SourceMan
    最滑稽的是碰到过一家 IDC 把用户 ID 弄大了 2w 然而忘了订单 ID 。。。
    Syc
        10
    Syc  
       2016-06-09 19:52:35 +08:00 via Android
    DES[Base64[(MD5 加盐(SHA1(时间戳+用户 ID+随机数)))+随机数+随机数]]
    chineselittleboy
        11
    chineselittleboy  
       2016-06-09 19:53:17 +08:00 via Android
    不是不能用自增的嘛
    eliteYang
        12
    eliteYang  
       2016-06-09 19:57:24 +08:00   ❤️ 1
    看下 snowflake 算法,比较适合你
    murmur
        13
    murmur  
       2016-06-09 19:57:46 +08:00
    @chineselittleboy 为什么不能自增 老用户 id 号短那是身份象征
    fy
        14
    fy  
       2016-06-09 20:03:46 +08:00
    我自用的 ObjectID 生成
    https://github.com/fy0/my-object-id
    fy
        15
    fy  
       2016-06-09 20:04:36 +08:00
    不过长度这种东西就没办法了
    honmaple
        16
    honmaple  
    OP
       2016-06-09 22:16:01 +08:00
    @Ouyangan 主要看到有说 uid 太长的话,对于 select 或者建立索引效率上有很大的影响
    honmaple
        17
    honmaple  
    OP
       2016-06-09 22:19:46 +08:00
    @YUX 额,好吧
    honmaple
        18
    honmaple  
    OP
       2016-06-09 22:21:33 +08:00
    @hxsf 每次都查重有些太繁琐了
    ethego
        19
    ethego  
       2016-06-09 22:22:31 +08:00
    @honmaple 无稽之谈
    honmaple
        20
    honmaple  
    OP
       2016-06-09 22:23:24 +08:00
    @eliteYang @fy OK,我参考一下
    honmaple
        21
    honmaple  
    OP
       2016-06-09 22:24:05 +08:00
    @ethego 能解释一下吗
    Syc
        22
    Syc  
       2016-06-09 22:26:27 +08:00 via Android
    @honmaple 只要把索引和缓存做好没有什么是不可能的。
    zhangxiao
        24
    zhangxiao  
       2016-06-09 22:30:57 +08:00
    @honmaple 如果你目前 18 位是 base 10 的可以生成后转 base 36
    ihuotui
        25
    ihuotui  
       2016-06-09 22:33:57 +08:00
    参考淘宝订单 id 规则。哈哈。
    hxsf
        26
    hxsf  
       2016-06-09 22:42:16 +08:00
    r#18 @honmaple 唯一一种可以在信息量减少的条件下保证不重复的办法就是查重。。。
    tabris17
        27
    tabris17  
       2016-06-09 22:45:32 +08:00
    自增 ID + Skip32 加密
    zzzhan
        28
    zzzhan  
       2016-06-09 22:51:53 +08:00   ❤️ 1
    优雅简洁地实现短 ID http://www.jianshu.com/p/ee469e1e1f9d
    honmaple
        29
    honmaple  
    OP
       2016-06-09 22:52:13 +08:00
    @ethego Thank you,正在研读
    honmaple
        30
    honmaple  
    OP
       2016-06-09 22:58:23 +08:00
    julyclyde
        31
    julyclyde  
       2016-06-09 23:59:08 +08:00
    我们公司早年是预先生成一堆,在一个单独保存 uid 的表里
    用的时候取一个出来
    jsq2627
        32
    jsq2627  
       2016-06-10 01:42:16 +08:00
    @honmaple
    @ethego
    在数据库中应用 UUID/GUID 要关注是否为 primary key 的问题。
    很多数据库系统是把 primary key 作为 clustered index 的, UUID/GUID 这类比较长的 ID 不适合作为 clustered index ,但是很适合作为 primary key 。
    如果数据库系统支持 clustered index 和 primary key 分离定义的话,应该用 UUID/GUID 列作为 primary key , auto increment 列作为 clustered index ,如果不支持分离,那最好还是别用 UUID/GUID 作为 primary key 。
    ethego
        33
    ethego  
       2016-06-10 01:48:43 +08:00
    @jsq2627 http://inessential.com/2014/04/15/more_on_uuids_and_clustered_indexes 有一定的道理,但是不要盲目优化,确定 uuid 真的在当前业务下会引起足够的性能损失再做决定。
    ryd994
        34
    ryd994  
       2016-06-10 02:25:45 +08:00
    谁说 uuid 比 20 位字符长的?
    uuid 是 128 位整数, 32 位 hex 字符
    128 vs 32*8=256

    mysql 官方文档: http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_uuid
    “ UUID() returns a value that conforms to UUID version 1 as described in RFC 4122. The value is a 128-bit number represented as a utf8 string of five hexadecimal numbers in aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee format ”
    9hills
        35
    9hills  
       2016-06-10 09:03:10 +08:00
    没有 32B ,如果使用常用字符表示的话, uuid 20B 足够了,毕竟只有 128bit
    julyclyde
        36
    julyclyde  
       2016-06-10 10:16:17 +08:00
    @jsq2627 说的很对, clustered index 很重要
    breeswish
        37
    breeswish  
       2016-06-10 13:30:33 +08:00
    直接 uuid 呀
    practicer
        38
    practicer  
       2016-06-14 17:53:55 +08:00
    我们公司用于跟踪用户行为的"uid"是 32 位长。能不能直接用标准库里的 hashlib 呢?
    import hashlib
    m = hashlib.md5()
    m.update('Obama')
    m.hexdigest()
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6107 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 02:18 · PVG 10:18 · LAX 18:18 · JFK 21:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.