V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
s609926202
V2EX  ›  问与答

老板说:生成三位数的随机数,不能重复。这道题怎么破?

  •  
  •   s609926202 · 2018-06-07 16:02:49 +08:00 · 4712 次点击
    这是一个创建于 2395 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我是想自动生成一个唯一的二级域名名称,目前是: site-时间戳-用户 ID.domain.com

    老板看到后说太长了,要控制在 3 位数,各位大神们有什么好的解决办法?

    25 条回复    2018-06-08 11:47:09 +08:00
    RihcardLu
        1
    RihcardLu  
       2018-06-07 16:06:05 +08:00
    26 个英文字母+10 个数字,36^3=46656
    4w 多个,每次生成逐一检索的查询量也很小了,关键是够用吗?
    ss098
        2
    ss098  
       2018-06-07 16:08:03 +08:00
    生成 3 位字母 / 数字的所有排列组合(由于 3 位的排列组合有限,不会占用很大内存,这是可以接受的),从中去除已经使用的组合,得到未使用的组合。

    从这个组合中随机抽取一个使用。
    nine99
        3
    nine99  
       2018-06-07 16:08:51 +08:00
    1 楼说的对
    ifishman
        4
    ifishman  
       2018-06-07 16:09:52 +08:00 via Android
    首先考虑是否够用,然后就随便了
    noe132
        5
    noe132  
       2018-06-07 16:54:33 +08:00 via Android
    生成所有组合然后乱序。需要时直接取一个出来就可以了
    viator42
        6
    viator42  
       2018-06-07 17:05:19 +08:00
    每一位都从 26 个字母和数字中随机一个字符,有几位数循环几次.生成之后查询数据库判断是否重复
    laoyur
        7
    laoyur  
       2018-06-07 17:30:48 +08:00   ❤️ 2
    你:报告老板,三位数只能 4w 个用户,咱们就这格局?
    老板:你个瓜娃子,三位数用完不会上四位数啊!
    glacer
        8
    glacer  
       2018-06-07 17:44:02 +08:00
    就算一位数是一个字节,也能表示 256 种 ASCII 码,三位随机数的空间已经达到 2^24 了。
    zhujinliang
        9
    zhujinliang  
       2018-06-07 17:56:12 +08:00 via iPhone   ❤️ 1
    www 那位会是谁呢
    MiffyLiye
        10
    MiffyLiye  
       2018-06-07 18:00:03 +08:00
    @glacer 但并不是随便什么字符都能往域名里放
    victor
        11
    victor  
       2018-06-07 18:04:00 +08:00
    @glacer RFC3986 文档规定,URL 中只允许包含英文字母( a-zA-Z )、数字( 0-9 )、-_.~ 4 个特殊字符以及所有保留字符。
    chinvo
        12
    chinvo  
       2018-06-07 18:07:08 +08:00
    @glacer #8 特殊字符是不能放进去的,还要考虑人可读性

    HashIDs 可以把 userid 加密为 url 友好的字符串,但是长度不可控

    如果自己实现算法, [a-z0-9-_] ^3 有 54872 种可能,数量确实不是太多

    不过如果长度是可以扩展的,填满三位之后从 a 开始填,甚至还可以把三位码保留作 VIP

    可以预先生成 [a-z0-9-_] ^3,有对应用户占用的就不会继续被分配,后续扩展的时候继续生成新的段就好

    预先生成一整个段还有一个好处是可以允许用户“选号”
    jimages
        13
    jimages  
       2018-06-07 18:25:22 +08:00 via iPhone
    @RihcardLu 你忘了区分大小写
    ob
        14
    ob  
       2018-06-07 18:31:48 +08:00 via Android   ❤️ 1
    @jimages 域名不区分大小写
    scnace
        15
    scnace  
       2018-06-07 19:30:20 +08:00 via Android   ❤️ 1
    1Il 0oO 记得去掉
    CFO
        16
    CFO  
       2018-06-07 20:00:10 +08:00 via Android
    符号再来一波 期待+1s
    loading
        17
    loading  
       2018-06-07 20:04:47 +08:00 via iPhone
    先全部生成出来,打乱放入数据库,然后按顺序分配就行。
    loserwn
        18
    loserwn  
       2018-06-07 20:13:41 +08:00
    [a-z][0-9] 3 位,相当于 36 进制随机数。
    kethylar
        19
    kethylar  
       2018-06-07 20:17:00 +08:00
    pwgen 3 -1 -n 1000000|awk '!a[$0]++'
    yiplee
        20
    yiplee  
       2018-06-07 21:26:40 +08:00 via iPhone
    数字 id 递增,然后 base62 一下,保证不会重复
    oIMOo
        21
    oIMOo  
       2018-06-07 22:56:41 +08:00
    @chinvo

    最近用到的一个,但是不确定不同值是否会产生相同 hash.


    # Doc: http://www.drdobbs.com/database/hashing-rehashed/184409859
    # code: https://sourceforge.net/p/cuckoo2mist/code/HEAD/tree/trunk/class_mist.py

    def ELFHash(key):
    hash = 0
    x = 0
    for i in range(len(key)):
    hash = (hash << 4) + ord(key[i])
    x = hash & 0xF0000000
    if x != 0:
    hash ^= (x >> 24)
    hash &= ~x
    return hash


    def int2hex(n, len):
    assert n is not None
    assert len is not None
    try:
    hexval = ('0' * len) + "%x" % int(n)
    except ValueError:
    hexval = ('0' * len) + "%x" % int(n, 16)
    return hexval[len * -1:]


    def hashPJW(text):
    number = ELFHash(text)
    res = int2hex(number, 8)
    return res
    silencefent
        22
    silencefent  
       2018-06-07 22:59:12 +08:00
    递归存数据库里,用一个删一个
    feverzsj
        23
    feverzsj  
       2018-06-07 23:30:01 +08:00
    62 个可选字符的话,对应所有三位 base62 的十进制数范围是[3844, 238327],随机选择一个转成 base62,因为只有 234484 种可能,所以还要查重。
    jingrui
        24
    jingrui  
       2018-06-08 09:19:38 +08:00 via iPhone
    1 楼对,生成前查下
    s609926202
        25
    s609926202  
    OP
       2018-06-08 11:47:09 +08:00 via iPhone
    @jingrui 这样的话就得把每次生成的都存进数据库里了、存表里好呢还是存字段值好?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   955 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 22:07 · PVG 06:07 · LAX 14:07 · JFK 17:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.