有哪些能够生成随机不重复字符串的算法或者函数?
有哪些能够生成随机不重复字符串的算法或者函数?最好是 PHP 中的~~
长度最好是在十来位以内啊~~ 附加个具体点的条件,应该尽量在 10 来位以内吧,然后最重要的是不重复,随机的只要看起来找不到规律就行。做那种类似优惠券的编码的~ ----------------------- 以下是精选回复-----------------------
答:md5(time())算不算,但是不能保证永不重复,只能说重复的概率非常小
答:之前看 tomcat 生产 sessionId 的时候用了函数查看是否重复,没有重复才返回
答:不说长度要求的 都是耍流氓
答:#!/bin/bash
echo $RANDOM
答:严格意义上讲生成一个「随机」且「不重复」的字符串是不可能的 ... 因为随机和唯一是互斥的两个条件 ...
生成不重复的字符串必须遵循一定规则 ... 这就不随机 ... 反之则一定存在碰撞概率 ... 只是这个概率或大或小而已 ...
所以对于标题的问题 ... 答案是一个都没有 ...
但如果你要的是一个「看似随机」且「没有那么容易重复」的方法的话 ... 那倒是有不少 ...
比如我个人常用的 uniqid( mt_rand( 0, 9999 ), true ) ... 碰撞条件是同一微秒内的万分之一概率 ...
或者唯一性要求不那么高的时候常用的在毫秒时间戳外面套一层摘要函数的办法 ... 如 md5( microtime() ) ...
这种方式生成速度比 uniqid 要快 ... 但碰撞条件不明且碰撞概率一定高于 uniqid ...
顺带一提楼上说的在时间戳后面增加随机字符串的方式除了拖慢执行之外毫无意义 ... 并不会降低碰撞概率 ...
答:如果是 linux 或者 mac 上 试试在命令行直接敲 uuidgen 吧……
答:利用 ascii 码自己写一个很简单的吧,重复概率取决于长度
答:补上一条 关于 uuid 出现冲突的可能性见 https://en.wikipedia.org/wiki/Universally_unique_identifier
话说话题是不是可以终结了?
答:<?php
$length = 32;
$crypto_strong = true;
$bytes = openssl_random_pseudo_bytes($length, $crypto_strong);
$hex = bin2hex($bytes);
print_r($hex);
答:用 100 次鼠标移动位置的坐标生成一个 RSA 1024 的字符串,基本上没什么重复的可能性!
答:为什么...不用...UUID 呢...
答:你想要的是 uuid 算法,去看看 uuid v3 , uuid v5 之类的 RFC 吧
答:LZ 要的是随机字符和历史产生的不重复,还是字符串里的字符不重复?
如果是后者,只算字母数字,最大长度 26+10 位。 LZ 我没说错吧。 py 里可以这样
>>> ''.join(random.choice('abcdefghijklmnopqrstuvwxyz0123456789') for _ in xrange(10))
'kaz2spd3hy'
答:UUID
妥妥的
答:分布式大概用机器编码+特征码+时间
其实用 UUID 不就解决了~
答:不说长度?
$hash="";
for ($i=1;$i<100;$i++) $hash .= md5(rand(1,999999999));
答:拼接,简单的随机+时间戳
第一时间我想到的是 uuid ,上面有人提到,我就不细说了。
答:echo bin2hex(random_bytes($length/2));
答:Guid().newID()
答:查看“ php 短网址生成程序”的算法就好了
答:大部分语言内置的随机生成器,只能保证在一定范围内哈希值不重复,没有绝对随机的生成器。这一点可以参考 Donald Knuth 的 the art of computer programming 第二卷里的内容。
答:其实我倒有个新思路
大家在上面谈到的都是怎么生成一定概率不重复的随机字符串,这些概率一般都是在单 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
答: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);
答:单机的话,自增 uid+随机字符串
绝对不重复,有一定随机性
答: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))
答:忽略我的回复,刚刚才看到是 PHP 节点的
答:楼上为啥有这么多重复造轮子的。。而且造的还很烂,根本不符合要求
现成的 UUID ,各个语言都有对应的库,嫌太长也有 short uuid 。
答:随机的重要程度和唯一的重要程度哪个更高些?时效有没有要求?
答:加上用户 id 就 ok 了
答:首先如果是无限数量肯定不能同时保证唯一和随机
数量不多的话我倾向于预先生成
答:说 md5 的是没考虑性能。。。生成 10 亿给大家看看
答:php 肯定是 uniqid 啊,楼上都在想什么 http://php.net/manual/zh/function.uniqid.php
答:uniqid 也有概率重复,可以一个进程专门生成随机串,插入到队列,需要的时候从队列取
答:uuid4
答:Des(0) des(1) des(2) ... 保证不重复,并且看似随机。
答:twitter 有个库,不过根据其算法,只能保证 x 年内不重复,自己搜吧。
答:说 MD5 慢的,你咋不上天, 10 亿也是秒级的。
答:UUID
答:有限長度與不重複不是明顯互斥嗎
答:可以参考 twitter 的 Snowflake 算法
答:UUID 吧, 重复概率极小
0条评论