tabris17
V2EX  ›  问与答

求唯一 ID 的生成算法

  •  1
     
  •   tabris17 · May 20, 2014 · 11435 views
    This topic created in 4558 days ago, the information mentioned may be changed or developed.
    已知一个数据库自增长的INT字段是唯一的,要把这个ID用散列算法映射到一个更大的空间里(比如6位数字),而且对于连续的INT,散列生成的结果离散性要好,比如1=》721370;2=》894357;3=》198222,而不是1=》100000;2=》200000,3=》300000,而且能保证不发生碰撞
    43 replies  •  2014-05-21 17:50:48 +08:00
    a591826944
    a591826944
    May 20, 2014
    1
    保证不发生碰撞?。。。怎么可能
    tabris17
    tabris17
    OP
    May 20, 2014❤️1
    2
    @a591826944 我从小空间映射到大空间,不发生碰撞是可以的吧
    loading
    loading
    May 20, 2014 via Android
    3
    uuid
    tabris17
    tabris17
    OP
    May 20, 2014
    4
    uuid如果用数字表示实在是太长了
    loading
    loading
    May 20, 2014 via Android
    5
    你这个id会有几个程序生成?如果是可控的,前面加个前缀不就好了?
    jybox
    jybox
    May 20, 2014
    6
    @tabris17 在数据库里 uuid 可以存成二进制类型,通常也是可索引可比较的
    tabris17
    tabris17
    OP
    May 20, 2014
    7
    @jybox 因为要作为URL的一部分,太长的话生成的二维码就比较“花”了
    tabris17
    tabris17
    OP
    May 20, 2014
    8
    @loading 加前缀不够“离散”哎,至少要看上去比较随机
    tabris17
    tabris17
    OP
    May 20, 2014
    9
    这么说吧,就是为了防止别人从ID来判断当前的最大记录,或者通过ID来枚举所有信息
    tabris17
    tabris17
    OP
    May 20, 2014
    11
    @xhacker 这个是用随机数生成的,会碰撞的吧
    wdd2007
    wdd2007
    May 20, 2014
    12
    md5
    kamal
    kamal
    May 20, 2014
    13
    关注一下,同样有这个需求
    tabris17
    tabris17
    OP
    May 20, 2014
    14
    @wdd2007 MD5没法保证不碰撞哪
    akira
    akira
    May 20, 2014
    15
    自增id后面加个随机数
    tabris17
    tabris17
    OP
    May 20, 2014
    16
    @akira 这个很容易就被发现规律了吧
    wdd2007
    wdd2007
    May 20, 2014
    17
    @tabris17 你可以测试下,测试100亿内的,不会有碰撞的。
    tabris17
    tabris17
    OP
    May 20, 2014
    18
    或者把自增ID的每位数字打散后插入随机数字符串里?
    tabris17
    tabris17
    OP
    May 20, 2014
    19
    @wdd2007 主要是MD5还是有点太长了
    crab
    crab
    May 20, 2014
    20
    当ID超过5位数呢?
    loading
    loading
    May 20, 2014 via Android
    21
    #矫情
    tabris17
    tabris17
    OP
    May 20, 2014
    22
    @crab 超过5位数,可以映射到10位数的空间里,投射到的空间大小没限制,但是也别太大了,MD5摘要128位,用数字表示要几十位了
    jakwings
    jakwings
    May 20, 2014
    23
    @tabris17 那就尽量找 ACID 支持比较完美的数据库软件,同时适量地进行人工分散。完美主义害人不浅,现在客服都没用了么……
    tabris17
    tabris17
    OP
    May 20, 2014
    24
    最后决定随机数+碰撞处理,就这样吧
    feikeq
    feikeq
    May 20, 2014
    25
    你可以试试用时间戳....
    tabris17
    tabris17
    OP
    May 20, 2014
    26
    @feikeq 时间戳精确到秒,还是会碰撞
    tabris17
    tabris17
    OP
    May 20, 2014
    27
    @feikeq 时间戳+自增ID的个位数,应该不会碰撞了吧,除非一秒内插入10条以上的记录
    guoruei
    guoruei
    May 20, 2014
    28
    时间戳+自定义ID,再来个按队列处理,妥妥的。
    ganxiyun
    ganxiyun
    May 20, 2014
    29
    RC2 64bits输出
    tabris17
    tabris17
    OP
    May 20, 2014
    30
    @guoruei 这……还是处理碰撞的成本低一点
    feikeq
    feikeq
    May 20, 2014
    32
    @tabris17 你可以再加个毫秒,我就是这样做的。
    tabris17
    tabris17
    OP
    May 20, 2014
    33
    @feikeq 也对,如果只要求10年内不发生碰撞,还可以把时间戳前面最高几位去掉,还能再短点
    aisk
    aisk
    May 20, 2014❤️1
    34
    skip32
    lu18887
    lu18887
    May 20, 2014
    35
    只有时间是唯一的!过了这一刻就不会再来了!所以,好好利用时间来避开碰撞。另外,随机的度不控制好就容易出现碰撞!每一个时间都是平行时空!
    lu18887
    lu18887
    May 20, 2014
    36
    时间+自增ID+不可逆算法
    tabris17
    tabris17
    OP
    May 20, 2014
    37
    @aisk 这个貌似好用,谢谢
    clippit
    clippit
    May 20, 2014
    38
    数字长一点没关系,加到 URL 里可以把它转换成36进制(a-z0-9)甚至62进制(A-Za-z0-9),这样就短了
    aisk
    aisk
    May 20, 2014
    39
    @tabris17 http://meizhi.im/ 现在数据库还是存的自增,显示出来的是skip32+base36,应该和你的需求一致
    banxi1988
    banxi1988
    May 21, 2014
    40
    找一个在第一象限单调递增的函数。把现在人id看成X
    Y=func(x),这样的Y就是你要的新的id.
    tabris17
    tabris17
    OP
    May 21, 2014
    41
    @aisk 非常感谢
    tabris17
    tabris17
    OP
    May 21, 2014
    42
    @aisk 网站很棒,已收藏
    hedaode
    hedaode
    May 21, 2014
    43
    可以把id简单加密(对称)下,这样既能保证id无明显规律,又能保持唯一性。例如:
    id=htonl(id);//颠倒字节顺序
    id=id^0x3f91b217;//异或加密,密码自定义
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2034 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 55ms · UTC 15:15 · PVG 23:15 · LAX 07:15 · JFK 10:15
    ♥ Do have faith in what you're doing.