有哪些能够生成随机不重复字符串的算法或者函数?

2016-05-18 16:22:50 +08:00
 Specs

有哪些能够生成随机不重复字符串的算法或者函数?最好是 PHP 中的~~

10687 次点击
所在节点    PHP
73 条回复
lygmqkl
2016-05-19 11:16:51 +08:00
其实我倒有个新思路
大家在上面谈到的都是怎么生成一定概率不重复的随机字符串,这些概率一般都是在单 server 和少量请求的情况下,一旦放到到复杂的架构中,比如 20 台 servers + 10k/s 请求多半都是歇菜

我想说的是利用一些简单的思路实现 100%不重复的随机字符串,具体如下:

大家只是把随机字符串妖魔化了,其实 1 , 2 , 3 , 4 , 5 不就是不重复的随机字符串吗?好吧如果你要随机字符串 md5(1) 就可以实现,或者利用拼接的方法因为你有 unique 的部分即 1, 2, 3, 4, 5

那么实现方法也很简单

$topic = new Topic();
//TODO add necessary attributes

if ($topic->save()) {
$randString = md5($topic->t_id);

echo $randString;//c20ad4d76fe97759aa27a0c99bff6710
}else{
//save fail, do sth
}

demo code 是用 Yii 写的应该能看得懂

牺牲的是一次数据库写入操作,得到的是一个 unique 的 seed, 这和老实的 order 系统很接近,我唯一做的事情就是把它放到了 RESTful 架构中,真的很好用。

另外附上我前一阵写的一篇文章,希望对楼主有帮助
http://yiilib.com/topic/671/php%E7%94%9F%E6%88%90100%25%E4%B8%8D%E9%87%8D%E5%A4%8D%E9%9A%8F%E6%9C%BA%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%AE%9E%E7%8E%B0%E6%96%B9%E6%B3%95
imydou
2016-05-19 11:23:42 +08:00
@lslqtz md5 长度一定了,重复几率差不多吧?
niuoh
2016-05-19 11:29:30 +08:00
function r($len=5){
$array=range(chr(33),chr(125));
shuffle($array);
for($i=0;$i<$len;$i++)$result.=$array[$i];
return $result;
}
echo r(5);
xmh51
2016-05-19 11:32:29 +08:00
@imydou md5 码被证实,会有一定机率重复。
lslqtz
2016-05-19 12:25:57 +08:00
@xmh51 重复几率小应该就没事吧。
lhbc
2016-05-19 12:43:33 +08:00
单机的话,自增 uid+随机字符串
绝对不重复,有一定随机性
fyooo
2016-05-19 14:18:00 +08:00
OCaml:

let random_str length =
let gen() = match Random.int(26+26+10) with
n when n < 26 -> int_of_char 'a' + n
| n when n < 26 + 26 -> int_of_char 'A' + n - 26
| n -> int_of_char '0' + n - 26 - 26 in
let gen _ = String.make 1 (char_of_int(gen())) in
String.concat ~sep:"" (Array.to_list (Array.init length ~f:gen))
fyooo
2016-05-19 14:18:52 +08:00
忽略我的回复,刚刚才看到是 PHP 节点的
9hills
2016-05-19 14:43:37 +08:00
楼上为啥有这么多重复造轮子的。。而且造的还很烂,根本不符合要求
现成的 UUID ,各个语言都有对应的库,嫌太长也有 short uuid 。
glchaos
2016-05-19 16:55:44 +08:00
随机的重要程度和唯一的重要程度哪个更高些?时效有没有要求?
ty0716
2016-05-19 17:12:58 +08:00
加上用户 id 就 ok 了
Specs
2016-05-19 17:49:07 +08:00
@glchaos 唯一是最重要的,但是最好别有规律,例如优惠券编码这样的
innoink
2016-05-19 18:05:24 +08:00
首先如果是无限数量肯定不能同时保证唯一和随机
数量不多的话我倾向于预先生成
20131115
2016-05-19 18:08:42 +08:00
说 md5 的是没考虑性能。。。生成 10 亿给大家看看
xujif
2016-05-19 18:16:45 +08:00
php 肯定是 uniqid 啊,楼上都在想什么 http://php.net/manual/zh/function.uniqid.php
cszchen
2016-05-19 19:04:49 +08:00
uniqid 也有概率重复,可以一个进程专门生成随机串,插入到队列,需要的时候从队列取
paulw54jrn
2016-05-19 19:07:44 +08:00
uuid4
akagi
2016-05-19 19:20:13 +08:00
@ayuanshuai929 高速调用会重复吧
pagxir
2016-05-19 19:58:30 +08:00
Des(0) des(1) des(2) ... 保证不重复,并且看似随机。
AbrahamGreyson
2016-05-19 20:14:41 +08:00
twitter 有个库,不过根据其算法,只能保证 x 年内不重复,自己搜吧。

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

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

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

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

© 2021 V2EX