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

2012-08-15 18:55:23 +08:00
 kenneth
最好是php,python,ruby语言实现。能否控制数字和字母随机出现的频率?
例如:m65m6yvber1qislv8o1,m7k02dqFWQ1qzfsy1o1
6522 次点击
所在节点    程序员
21 条回复
9hills
2012-08-15 18:56:49 +08:00
每位都random一下不就好了,然后拼起来
luin
2012-08-15 19:18:06 +08:00
同上……又快又省事
cmaxvv
2012-08-15 19:20:00 +08:00
如果长度没有要求,直接uuid
或者,随机数,然后转成(10个数字+26个字母)36进制
PrideChung
2012-08-15 19:42:09 +08:00
简单的就生成GUID然后按需要长度截取,绝对唯一是不可能的,MD5还会有碰撞呢。
sethverlo
2012-08-15 19:58:18 +08:00
我想过这个问题。直接对时间进行 md5 貌似可以吧?

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

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

rand(36**40).to_s 36
lisztli
2012-08-15 21:29:05 +08:00
「唯一」的「随机字符串」
你不觉得这俩词矛盾吗?
hahastudio
2012-08-15 21:34:06 +08:00
再大的枚举空间,不也是有穷的么= =
先随机一个字符串,然后hash判重?重复就再随机好了= =
CoX
2012-08-15 21:36:45 +08:00
import random
from string import letters,digits

def GetSalt(num=8):
----item = random.sample((letters+digits)*num,num)
----return ''.join(item)
fwee
2012-08-15 21:39:36 +08:00
@alvin2ye

这个是错的

这样才对
rand(36..36**40).to_s 36
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
2012-08-16 01:39:52 +08:00
@sethverlo +1

秒级md5 够用了
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
2012-08-16 11:02:08 +08:00
$ which secret.gen
secret.gen: aliased to head -2 /dev/urandom | sha1sum | base64
chshouyu
2012-08-16 12:05:41 +08:00
md5或者sha1算法
Mutoo
2012-08-16 12:23:09 +08:00
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
2012-08-17 00:19:04 +08:00
哎呦,没有缩进。python太难看了。
通过将生成的序列号放在文件里,然后进行读取判断,防止重复。
zhaobei92
2012-08-17 00:19:59 +08:00
程序缩进后应该没问题。这个是我测试生成的。
cpiESpUxAw
e0dgnfajte
xEHvectmXm
A6aTEBL8HI
D3wAabuvXS
L1gOjovfrb
Ica2dJQPC1

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/45232

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX