PHP-php生成6位永不重复的随机数

发布于 2016-12-08 17:42:08 字数 81 浏览 4556 评论 9

如何才能用PHP生成6位永不重复的随机数呢,随机数中只能包含大写的字母和数字,现在急啊,想了好几天了,都不行,请求各位大哥帮帮忙啊,感激不尽!!!1

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

泛泛之交 2017-09-07 16:06:43

你肯定需要将生成过的随机数保存查询查询已经生成过的数过滤。
对于这种类似的问题可以用充值卡的方式来实现。
1.先将所有的6位随机数生成保存在库。
2.然后随机update 状态为未使用的一条记录的状态。
3.再查询更改记录的随机数。

瑾兮 2017-08-10 14:12:34

用php的str_shuffle函数:

<?php
$randStr = str_shuffle('ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890');
$rand = substr($randStr,0,6);
?>

浮生未歇 2017-07-29 13:47:12

建议用数据库先成好不重复的6位数,每次取完后直接把这条记录删除掉。
数据库设计:

CREATE TABLE `order_number_pool` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`number` varchar(6) NOT NULL,
`is_used` tinyint(4) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `number` (`number`)
) ENGINE=InnoDB

瑾兮 2017-05-06 04:59:12

如果是做那个短地址的话,google有一个开源的shorturl API,可以生成一串不定长的数字,不知道能不能解决你的问题。

 <?
echo googlToken("www.google.com");
function googlToken($b){
$i = tke($b);
$i = $i >> 2 & 1073741823;
$i = $i >> 4 & 67108800 | $i & 63;
$i = $i >> 4 & 4193280 | $i & 1023;
$i = $i >> 4 & 245760 | $i & 16383;
$j = "7";
$h = tkf($b);
$k = ($i >> 2 & 15) << 4 | $h & 15;
$k |= ($i >> 6 & 15) << 12 | ($h >> 8 & 15) << 8;
$k |= ($i >> 10 & 15) << 20 | ($h >> 16 & 15) << 16;
$k |= ($i >> 14 & 15) << 28 | ($h >> 24 & 15) << 24;
$j .= tkd($k);
return $j;
}
function tkc(){
$l = 0;
foreach (func_get_args() as $val) {
$val &= 4294967295;
$val += $val > 2147483647 ? -4294967296 : ($val < -2147483647 ? 4294967296 : 0);
$l += $val;
$l += $l > 2147483647 ? -4294967296 : ($l < -2147483647 ? 4294967296 : 0);
}
return $l;
}
function tkd($l){
$l = $l > 0 ? $l : $l + 4294967296;
$m = "$l"; //must be a string
$o = 0;
$n = false;
for($p = strlen($m) - 1; $p >= 0; --$p){
$q = $m[$p];
if($n){
$q *= 2;
$o += floor($q / 10) + $q % 10;
} else {
$o += $q;
}
$n = !$n;
}
$m = $o % 10;
$o = 0;
if($m != 0){
$o = 10 - $m;
if(strlen($l) % 2 == 1){
if ($o % 2 == 1){
$o += 9;
}
$o /= 2;
}
}
return "$o$l";
}
function tke($l){
$m = 5381;
for($o = 0; $o < strlen($l); $o++){
$m = tkc($m << 5, $m, ord($l[$o]));
}
return $m;
}
function tkf($l){
$m = 0;
for($o = 0; $o < strlen($l); $o++){
$m = tkc(ord($l[$o]), $m << 6, $m << 16, -$m);
}
return $m;
}
?>

晚风撩人 2017-02-12 23:10:45

写个递归验证函数,一方面把生成的数在数据库表中检索,已存在则抛弃,调用自身再次生成;不存在,则使用;不过对服务器压力大些;
也可采用楼工的“google有一个开源的shorturl API”,没用过就不再谈了

偏爱自由 2017-02-08 09:45:48

这个要看你要的数据量吧,所有的大写字母和数字,也是一个有限的集合,保证它的绝对不重复很难,但是可以相对处理,给你个思路,可以现在的时间的md5值,再将这个32位的字符串,转化成对应的6位字母数字组合,这样重复的几率会很小

瑾兮 2017-01-14 01:57:01

 error_reporting(0);
function export_csv($filename,$data) {
header("Content-type:text/csv");
header("Content-Disposition:attachment;filename=".$filename);
header('Cache-Control:must-revalidate,post-check=0,pre-check=0');
header('Expires:0');
header('Pragma:public');
echo $data;
}
$array= array();
for($i=1;$i<=500000;$i++){
$string = substr(md5(uniqid($i.'x'.$i.'f'.$i.'s'.$i.rand(), true)),0,12);
array_push($array,$string);
}
$result = array_unique($array);
$str = implode("rn",$result);
$str = iconv('utf-8','gb2312',$str);
$filename = date('Ymd').'.csv'; //设置文件名
export_csv($filename,$str); //导出

我最近写的一次性生成导出csv,主要使用数组array_unique做唯一性的限制,可能少于预定的个数。

浮生未歇 2017-01-12 17:45:39

如果可以改为32位的话,可以利用 chinlon 说的 利用当前时间的 md5 值。重复概率超级小。

泛泛之交 2016-12-13 23:35:14

你是不是想做类似团购的验证码? 6位的有些短了 建议至少8位
临时想到的给你参考下:

6位 分解成 4+1+1 前4位序列生成,第5位随机一个字符, 为了安全起见 第6位是验证码 验证这个编码是否合法。

前4位是 32进制的 数字和小写字母混合(PHP自带函数可实现10进制和36进制互转)
如:0001,0002 …… 000a ,000b,1a2e 4为最高容量大概是170万
第5位随机一个字符(小写字母或0-9) 没什么好说的 加这个随机 可提高安全性 不加也可以
第6位 验证位 是根据前面 5个字符计算出来的。但是怎么计算 我就不说了 你自己想,其实也不能说 这个相当于加密规则了。

这样 你可以生成大概170万 验证码 并且可验证 有效性

如果前面再加上2位 日期 月+日(有人说 2位怎么表示月和日,和上面一样使用36进制) 这样 你每天都可以发送170万 验证码了 而且每天都不重复。。。 大致这样。。。供参考!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文