如何生成一个不重复的16位的序列号? 用SQL语句的NEWID比较好或者用 年+月+日+时+分+秒+两位随机数或者 月+日+时+分+秒+六位随机数 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果想用时间来做为一部分的随机数的话直接用time().与上一个6位的随机数就可以了. $id=234;//取newid $s=' NO|0|14|1'; $v=explode("|",$s); if($v[1]=="") $v[1]="0"; if($v[2]=="") $v[2]=5; if($v[3]!="") $v[3]=(int)$id+(int)$v[3]; else $v[3]=$id; $r=str_pad($v[3],$v[2],$v[1],STR_PAD_LEFT); $r=$v[0].$r; echo $r;============ 很难重复!<?echo echo substr(md5(uniqid(rand(),1)), 8, 16);?> 晕,多了个echo ! 各位见笑了 substr(md5(uniqid(rand(),1)), 8, 16);这么简单就可以了?关于用时间来生成序列号的,有什么函数代码么?谢谢大家! $str = time().substr(md5(uniqid(mt_rand(),1)), 10, 16);应该是绝对不会重复的。 用substr(md5(uniqid(mt_rand(),1)), 10, 16);的话里面有字母的所以不行 同意aoenzh(独孤大虾)的意见,用时间来作,永远不会重复 xuzuning(唠叨) 好象否定了用时间的算法那应该怎么做呢?MD5吗? php的md5是32位的,所以不能符合你的要求并不是绝对不能用时间的,但至少要精确到微秒(php只提供到这里)你可以先做一个测试,看看精确到微秒能否满足要求(与机器硬件有关)<?php//用时间做序号$ar = array();for($i=0;$i<10;$i++) { $s = split(" ",microtime()); $ar[] = "$s[1] $s[0]";}print_r($ar);?>结果中的第一段是秒第二段是精确到微秒的小数,你先检查他是否有重复若没有,则表示您的机器“慢到”可以分辨微秒那么可以<?php$ar = array();for($i=0;$i<10;$i++) { $s = split(" ",microtime()); $ar[] = $s[1].substr($s[0],2,6);}print_r($ar);?>并再次检查是否有重复 <?php/*** 类名: 编码类* 描述: 关于编码* 其他: 2004-5-10*/class code{ /** * 函数名称: genID * 函数功能: 设置种子 * 输入参数: $size -------------- 要生成的数量 * $length ----------- 长度 * $mode ------------- 模式 * 函数返回值: 返回值说明 * 其它说明: 说明 */ function genID($size,$length,$mode) { $code_array = array(); $offset = 1.5;// 为避免递归,采用取子集的办法 $offsize = $size*$offset; for($count = 0; $count < $offsize; $count++) { $code_array[] = $this->_seed( $length, $mode ); } $unique_array = array_unique( $code_array ); return array_slice ($unique_array, 0,$size); } /** * 函数名称: seed * 函数功能: 设置种子 * 输入参数: $length ----------- 长度 * $mode ----------- 模式 * 函数返回值: 返回值说明 * 其它说明: 说明 */ function _seed($length=10, $mode) { switch( $mode ) { case '1': $str = '1234567890'; break; case '2': $str = 'abcdefghijklmnopqrstuvwxyz'; break; case '3': $str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; break; case '4': $str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; break; case '5': $str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'; break; case '6': $str = 'abcdefghijklmnopqrstuvwxyz1234567890'; break; default: $str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'; break; } $result = ''; $seedlength = strlen($str)-1; for( $i = 0; $i <= $length-1; $i++ ) { $num = mt_rand( 0, $seedlength ); $result .= $str[$num]; } return $result; }}$code = &new code;// 产生100个不重复的16位的纯数字IDprint_r($code->genID( 100, 16, 1));?> 谢谢大家,最后通过ORACLE的序列来产生序列号的。HOHO实在是太偷懒了。 在PHP中$this 和->的用法和意思 这是什么加密形式? 怎么给php源代码加密? 数组排序的问题,在线等 三表关联 格式化时间的简单问题~~ 使用PDO获取多个结果集似乎有问题!?nextRowset() fetchAll() mysqli执行mysql事务的问题 这个句子缺引号么?在线等待 加入include或require_once后post/ajax无法接收数据 急!!100分求网站推广软件和注册码!在线等 UNIX下的php问题!
$s=' NO|0|14|1';
$v=explode("|",$s);
if($v[1]=="") $v[1]="0";
if($v[2]=="") $v[2]=5;
if($v[3]!="") $v[3]=(int)$id+(int)$v[3];
else $v[3]=$id;
$r=str_pad($v[3],$v[2],$v[1],STR_PAD_LEFT);
$r=$v[0].$r;
echo $r;
============
这么简单就可以了?关于用时间来生成序列号的,有什么函数代码么?谢谢大家!
应该是绝对不会重复的。
你可以先做一个测试,看看精确到微秒能否满足要求(与机器硬件有关)
<?php
//用时间做序号
$ar = array();
for($i=0;$i<10;$i++) {
$s = split(" ",microtime());
$ar[] = "$s[1] $s[0]";
}
print_r($ar);
?>
结果中的第一段是秒
第二段是精确到微秒的小数,你先检查他是否有重复
若没有,则表示您的机器“慢到”可以分辨微秒
那么可以
<?php
$ar = array();
for($i=0;$i<10;$i++) {
$s = split(" ",microtime());
$ar[] = $s[1].substr($s[0],2,6);
}
print_r($ar);
?>
并再次检查是否有重复
/**
* 类名: 编码类
* 描述: 关于编码
* 其他: 2004-5-10
*/
class code
{
/**
* 函数名称: genID
* 函数功能: 设置种子
* 输入参数: $size -------------- 要生成的数量
* $length ----------- 长度
* $mode ------------- 模式
* 函数返回值: 返回值说明
* 其它说明: 说明
*/
function genID($size,$length,$mode)
{
$code_array = array();
$offset = 1.5;// 为避免递归,采用取子集的办法
$offsize = $size*$offset;
for($count = 0; $count < $offsize; $count++)
{
$code_array[] = $this->_seed( $length, $mode );
}
$unique_array = array_unique( $code_array );
return array_slice ($unique_array, 0,$size);
} /**
* 函数名称: seed
* 函数功能: 设置种子
* 输入参数: $length ----------- 长度
* $mode ----------- 模式
* 函数返回值: 返回值说明
* 其它说明: 说明
*/
function _seed($length=10, $mode)
{
switch( $mode )
{
case '1':
$str = '1234567890';
break;
case '2':
$str = 'abcdefghijklmnopqrstuvwxyz';
break;
case '3':
$str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
break;
case '4':
$str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
break;
case '5':
$str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
break;
case '6':
$str = 'abcdefghijklmnopqrstuvwxyz1234567890';
break;
default:
$str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890';
break;
} $result = '';
$seedlength = strlen($str)-1;
for( $i = 0; $i <= $length-1; $i++ )
{
$num = mt_rand( 0, $seedlength );
$result .= $str[$num];
}
return $result;
}
}
$code = &new code;// 产生100个不重复的16位的纯数字ID
print_r($code->genID( 100, 16, 1));
?>