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

Python 有没有短一点的 UUID?

  •  
  •   invite · 2014-12-23 20:20:36 +08:00 · 20889 次点击
    这是一个创建于 3621 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在的UUID太长了,能不能生成短一点的?
    22 条回复    2014-12-24 13:14:50 +08:00
    wy315700
        1
    wy315700  
       2014-12-23 20:37:13 +08:00
    取前几位不就行了
    9hills
        2
    9hills  
       2014-12-23 20:49:23 +08:00
    @wy315700 前几位就丧失了UUID的意义

    UUID的意义就是绝不会重复
    GeekGao
        3
    GeekGao  
       2014-12-23 20:53:49 +08:00
    @9hills 前几位+当前时间戳
    ooh
        4
    ooh  
       2014-12-23 21:05:53 +08:00
    如果象上面那样你自己用时间戳写一个函数更方便
    cbsw
        5
    cbsw  
       2014-12-23 21:06:38 +08:00
    UUID 定义就是这么长的,是根据时间和空间唯一确定的一个标识符。LZ 想要的是一定范围内的唯一标识符,这个可以自己用随机数生成,然后通过记录保证唯一性(重复的丢掉)
    wy315700
        6
    wy315700  
       2014-12-23 21:14:27 +08:00
    @9hills 计算一下概率 其实本质是一样的 重复的概率和你的长度有关
    mathgl
        7
    mathgl  
       2014-12-23 21:23:30 +08:00
    我现在用 bson 的那个 objectid.

    24位,也几乎是一致性。
    9hills
        8
    9hills  
       2014-12-23 22:26:23 +08:00 via iPhone
    @wy315700 python默认的uuid也叫guid
    http://www.ietf.org/rfc/rfc4122.txt

    如果简单认为长度和概率相关就太……
    wy315700
        9
    wy315700  
       2014-12-23 23:10:16 +08:00
    @9hills 给UUID做一个hash 然后取前多少位 基本上就没问题了
    14
        10
    14  
       2014-12-23 23:34:40 +08:00 via Android
    import shortuuid
    14
        11
    14  
       2014-12-23 23:37:07 +08:00 via Android
    搭车问,现在项目里面有这样一个需求,遇到重复的用户名自动重命名,现在我是直接在后面加四位随机数,貌似到现在没有看到过报错
    kavinyao
        12
    kavinyao  
       2014-12-23 23:56:14 +08:00
    得看应用场景。

    如果不是分布式系统,维护一个自增序列即可。

    如果是在分布式环境,对一致性要求高的话,UUID几乎是唯一选择;反之,如果可以容忍一定程度的重复,一些简单的方案也是可行的。
    geeklian
        13
    geeklian  
       2014-12-24 00:11:23 +08:00
    首先把uuid转换成10进制,然后再转换成某个大于16进制的字符串,这样长度缩短,随机性什么都不变。

    转换成10进制使用:
    int(uuid.uuid1().hex,16)
    incompatible
        14
    incompatible  
       2014-12-24 00:42:11 +08:00
    uuid的32个字符保证的是universal unique
    实际上你只需要application scope的unique,所以用uuid真的很浪费、不如自己写一个

    用数据库实现一个sequence很简单的
    如果是高并发系统,可以参考淘宝的订单号生成机制。预先分配一批随取随用,快用完时再分配一批。也不难实现的。
    geew
        15
    geew  
       2014-12-24 10:14:42 +08:00
    @14 那是你人品好 之前看到的一个做法是建一张表来记录重命名的用户名信息 类似这样
    name seq seq记录这个名字的使用次数 反正新的名字的时候取seq+1就行
    9hills
        16
    9hills  
       2014-12-24 10:23:32 +08:00
    @wy315700 有算法依据么。。你这个还不如

    @invite https://github.com/stochastic-technologies/shortuuid
    invite
        17
    invite  
    OP
       2014-12-24 10:25:57 +08:00
    @14 @9hills 看了下,好像不错。不过看代码似乎是从uuid压缩转换了一下。是不是可以理解为uuid的压缩版?
    wy315700
        18
    wy315700  
       2014-12-24 10:35:15 +08:00
    @9hills

    http://pastie.org/pastes/8619409#

    看这么多不如写个程序跑跑看重复性。


    然后是否随机可以用rngtest
    参考树莓派的测试方法

    http://www.oschina.net/translate/well-that-was-unexpected-the-raspberry-pis-hardware-random-number-generator
    9hills
        19
    9hills  
       2014-12-24 11:08:36 +08:00
    @invite 嗯,压缩保证不损失信息,从而不影响唯一性。


    @wy315700 这是个数学问题,而不是测试问题。。
    invite
        20
    invite  
    OP
       2014-12-24 11:49:19 +08:00
    @9hills 不错不错,不过要是官方提供一个UUID压缩接口就更好了。
    qbeenslee
        21
    qbeenslee  
       2014-12-24 13:01:31 +08:00
    uuid压缩成64位编码, 短那么点

    http://www.oschina.net/code/snippet_1053241_43212
    lixm
        22
    lixm  
       2014-12-24 13:14:50 +08:00
    base64.urlsafe_b64encode(uuid.uuid4().bytes)[:-2] 可以压缩为22位
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1356 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 23:51 · PVG 07:51 · LAX 15:51 · JFK 18:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.