V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kenneth
V2EX  ›  程序员

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

  •  
  •   kenneth · 2012-08-15 18:55:23 +08:00 · 6484 次点击
    这是一个创建于 4475 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最好是php,python,ruby语言实现。能否控制数字和字母随机出现的频率?
    例如:m65m6yvber1qislv8o1,m7k02dqFWQ1qzfsy1o1
    21 条回复    1970-01-01 08:00:00 +08:00
    9hills
        1
    9hills  
       2012-08-15 18:56:49 +08:00   ❤️ 1
    每位都random一下不就好了,然后拼起来
    luin
        2
    luin  
       2012-08-15 19:18:06 +08:00
    同上……又快又省事
    cmaxvv
        3
    cmaxvv  
       2012-08-15 19:20:00 +08:00   ❤️ 1
    如果长度没有要求,直接uuid
    或者,随机数,然后转成(10个数字+26个字母)36进制
    PrideChung
        4
    PrideChung  
       2012-08-15 19:42:09 +08:00
    简单的就生成GUID然后按需要长度截取,绝对唯一是不可能的,MD5还会有碰撞呢。
    sethverlo
        5
    sethverlo  
       2012-08-15 19:58:18 +08:00
    我想过这个问题。直接对时间进行 md5 貌似可以吧?

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

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

    rand(36**40).to_s 36
    lisztli
        8
    lisztli  
       2012-08-15 21:29:05 +08:00
    「唯一」的「随机字符串」
    你不觉得这俩词矛盾吗?
    hahastudio
        9
    hahastudio  
       2012-08-15 21:34:06 +08:00
    再大的枚举空间,不也是有穷的么= =
    先随机一个字符串,然后hash判重?重复就再随机好了= =
    CoX
        10
    CoX  
       2012-08-15 21:36:45 +08:00   ❤️ 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  
       2012-08-15 21:39:36 +08:00
    @alvin2ye

    这个是错的

    这样才对
    rand(36..36**40).to_s 36
    alvin2ye
        12
    alvin2ye  
       2012-08-15 23:42:57 +08:00
    @fwee


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

    秒级md5 够用了
    ipconfiger
        14
    ipconfiger  
       2012-08-16 10:57:49 +08:00
    精确控制频率很困难,但是如果要大致上差不离就简单

    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  
       2012-08-16 11:02:08 +08:00   ❤️ 1
    $ which secret.gen
    secret.gen: aliased to head -2 /dev/urandom | sha1sum | base64
    chshouyu
        16
    chshouyu  
       2012-08-16 12:05:41 +08:00
    md5或者sha1算法
    Mutoo
        17
    Mutoo  
       2012-08-16 12:23:09 +08:00
    zhaobei92
        18
    zhaobei92  
       2012-08-17 00:17:41 +08:00
    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  
       2012-08-17 00:19:04 +08:00
    哎呦,没有缩进。python太难看了。
    通过将生成的序列号放在文件里,然后进行读取判断,防止重复。
    zhaobei92
        20
    zhaobei92  
       2012-08-17 00:19:59 +08:00
    程序缩进后应该没问题。这个是我测试生成的。
    cpiESpUxAw
    e0dgnfajte
    xEHvectmXm
    A6aTEBL8HI
    D3wAabuvXS
    L1gOjovfrb
    Ica2dJQPC1
    chx007
        21
    chx007  
       2012-08-17 10:15:41 +08:00
    uuid后再将其16进制值转为62进制值 [大小写字母(26+26) + 数字 (10) ]
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1055 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 22:45 · PVG 06:45 · LAX 14:45 · JFK 17:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.