• 请不要在回答技术问题时复制粘贴 AI 生成的内容
kenneth
V2EX  ›  程序员

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

  •  
  •   kenneth · Aug 15, 2012 · 7875 views
    This topic created in 5200 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
    9hills
    Aug 15, 2012❤️1
    1
    每位都random一下不就好了,然后拼起来
    luin
    luin
    Aug 15, 2012
    2
    同上……又快又省事
    cmaxvv
    cmaxvv
    Aug 15, 2012❤️1
    3
    如果长度没有要求,直接uuid
    或者,随机数,然后转成(10个数字+26个字母)36进制
    PrideChung
    PrideChung
    Aug 15, 2012
    4
    简单的就生成GUID然后按需要长度截取,绝对唯一是不可能的,MD5还会有碰撞呢。
    sethverlo
    sethverlo
    Aug 15, 2012
    5
    我想过这个问题。直接对时间进行 md5 貌似可以吧?

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

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

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

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

    这个是错的

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


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

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

    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
    ratazzi
    PRO
    Aug 16, 2012❤️1
    15
    $ which secret.gen
    secret.gen: aliased to head -2 /dev/urandom | sha1sum | base64
    chshouyu
    chshouyu
    Aug 16, 2012
    16
    md5或者sha1算法
    zhaobei92
    zhaobei92
    Aug 17, 2012
    18
    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
    zhaobei92
    Aug 17, 2012
    19
    哎呦,没有缩进。python太难看了。
    通过将生成的序列号放在文件里,然后进行读取判断,防止重复。
    zhaobei92
    zhaobei92
    Aug 17, 2012
    20
    程序缩进后应该没问题。这个是我测试生成的。
    cpiESpUxAw
    e0dgnfajte
    xEHvectmXm
    A6aTEBL8HI
    D3wAabuvXS
    L1gOjovfrb
    Ica2dJQPC1
    chx007
    chx007
    Aug 17, 2012
    21
    uuid后再将其16进制值转为62进制值 [大小写字母(26+26) + 数字 (10) ]
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   941 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 53ms · UTC 20:09 · PVG 04:09 · LAX 12:09 · JFK 15:09
    ♥ Do have faith in what you're doing.