问个算法,如何获得一个唯一的随机字符串,包括数字,字母大小写的。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
kenneth
V2EX    程序员

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

  •  
  •   kenneth 2012-08-15 18:55:23 +08:00 7049 次点击
    这是一个创建于 4880 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最好是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     Solana     3209 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 11:18 PVG 19:18 LAX 03:18 JFK 06:18
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86