怎样选择 uid 生成策略? - V2EX
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 7813 次点击
    这是一个创建于 3486 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我想问一下大家的 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  
    PRO
       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 1: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
    @jsq627 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     Solana     5161 人在线   最高记录 6679       Select Langage
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 07:42 PVG 15:42 LAX 23:42 JFK 02:42
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86