V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
kenneth
V2EX  ›  程序员

问个算法,如何获得一个唯一的随机字符串,包括数字,字母大小写的。

  •  
  •   kenneth · Aug 15, 2012 · 7296 views
    This topic created in 5010 days ago, the information mentioned may be changed or developed.
    最好是php,python,ruby语言实现。能否控制数字和字母随机出现的频率?
    例如:m65m6yvber1qislv8o1,m7k02dqFWQ1qzfsy1o1
    21 replies    1970-01-01 08:00:00 +08:00
    9hills
        1
    9hills  
       Aug 15, 2012   ❤️ 1
    每位都random一下不就好了,然后拼起来
    luin
        2
    luin  
       Aug 15, 2012
    同上……又快又省事
    cmaxvv
        3
    cmaxvv  
       Aug 15, 2012   ❤️ 1
    如果长度没有要求,直接uuid
    或者,随机数,然后转成(10个数字+26个字母)36进制
    PrideChung
        4
    PrideChung  
       Aug 15, 2012
    简单的就生成GUID然后按需要长度截取,绝对唯一是不可能的,MD5还会有碰撞呢。
    sethverlo
        5
    sethverlo  
       Aug 15, 2012
    我想过这个问题。直接对时间进行 md5 貌似可以吧?

    1L 和 2L 的算法还得判重呢。。

    顺便问 @PrideChung 已知的碰撞已经有了么?只记得好早以前说中国的那个专家说会有碰撞。一直没见过碰撞的情况。。。
    luin
        6
    luin  
       Aug 15, 2012
    @sethverlo 相当于随机字符,把字符空间和长度设成和md5一样,在随机算法好和生成数量少的情况下不必担心碰撞问题
    alvin2ye
        7
    alvin2ye  
       Aug 15, 2012
    ruby version

    rand(36**40).to_s 36
    lisztli
        8
    lisztli  
       Aug 15, 2012
    「唯一」的「随机字符串」
    你不觉得这俩词矛盾吗?
    hahastudio
        9
    hahastudio  
       Aug 15, 2012
    再大的枚举空间,不也是有穷的么= =
    先随机一个字符串,然后hash判重?重复就再随机好了= =
    CoX
        10
    CoX  
       Aug 15, 2012   ❤️ 1
    import random
    from string import letters,digits

    def GetSalt(num=8):
    ----item = random.sample((letters+digits)*num,num)
    ----return ''.join(item)
    fwee
        11
    fwee  
       Aug 15, 2012
    @alvin2ye

    这个是错的

    这样才对
    rand(36..36**40).to_s 36
    alvin2ye
        12
    alvin2ye  
       Aug 15, 2012
    @fwee


    [~] $ irb
    ree-1.8.7-2011.03 :001 > rand(36**40).to_s 36
    => "ueyvoa25sa7x3i1tzdlrz8h0rqf0a7in5jjje0jj"
    SuperOS
        13
    SuperOS  
       Aug 16, 2012
    @sethverlo +1

    秒级md5 够用了
    ipconfiger
        14
    ipconfiger  
       Aug 16, 2012
    精确控制频率很困难,但是如果要大致上差不离就简单

    In [2]: import random

    In [3]: sample="1234567890"

    In [4]: random.sample(sample,4)
    Out[4]: ['2', '0', '3', '9']

    In [5]: "".join(random.sample(sample,10))
    Out[5]: '6751093482'

    现在实现了出随机数,如果要增加1出现的频率,那么就把sample的值改成

    sample="11111234567890"

    然后继续生成

    In [7]: "".join(random.sample(sample,10))
    Out[7]: '5110381461'

    看,1出现的频率就增加了。

    至于要又有字母又有数字还要大小写的

    sample="1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"
    就ok了,要谁出现的频率高就多打几个就ok了
    ratazzi
        15
    ratazzi  
       Aug 16, 2012   ❤️ 1
    $ which secret.gen
    secret.gen: aliased to head -2 /dev/urandom | sha1sum | base64
    chshouyu
        16
    chshouyu  
       Aug 16, 2012
    md5或者sha1算法
    Mutoo
        17
    Mutoo  
       Aug 16, 2012
    zhaobei92
        18
    zhaobei92  
       Aug 17, 2012
    from random import randint
    p=file('a.txt','a+')
    pt=p.readlines()
    p.seek(0)

    N='abcdefghijklmnopqrstuvwxyz'
    M=N.upper()
    L='1234567890'
    S=N+M+L
    def func(x):
    s=''
    for i in range(10):
    t=randint(0,len(x)-1)
    s+=x[t]

    return s
    mima=func(S)
    print mima
    def dis(mima):
    for i in pt:
    if i==mima:
    mima=func(S)
    dis(mima)

    p.write('\n'+mima)
    p.close()
    dis(mima)
    print pt
    zhaobei92
        19
    zhaobei92  
       Aug 17, 2012
    哎呦,没有缩进。python太难看了。
    通过将生成的序列号放在文件里,然后进行读取判断,防止重复。
    zhaobei92
        20
    zhaobei92  
       Aug 17, 2012
    程序缩进后应该没问题。这个是我测试生成的。
    cpiESpUxAw
    e0dgnfajte
    xEHvectmXm
    A6aTEBL8HI
    D3wAabuvXS
    L1gOjovfrb
    Ica2dJQPC1
    chx007
        21
    chx007  
       Aug 17, 2012
    uuid后再将其16进制值转为62进制值 [大小写字母(26+26) + 数字 (10) ]
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2478 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 65ms · UTC 15:15 · PVG 23:15 · LAX 08:15 · JFK 11:15
    ♥ Do have faith in what you're doing.