用SQL语句的NEWID比较好
或者用 年+月+日+时+分+秒+两位随机数
或者 月+日+时+分+秒+六位随机数

解决方案 »

  1.   

    如果想用时间来做为一部分的随机数的话直接用time().与上一个6位的随机数就可以了.
      

  2.   

    $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;
    ============
      

  3.   

    很难重复!<?echo echo substr(md5(uniqid(rand(),1)), 8, 16);?>
      

  4.   

    晕,多了个echo ! 各位见笑了
      

  5.   

    substr(md5(uniqid(rand(),1)), 8, 16);
    这么简单就可以了?关于用时间来生成序列号的,有什么函数代码么?谢谢大家!
      

  6.   

    $str =  time().substr(md5(uniqid(mt_rand(),1)), 10, 16);
    应该是绝对不会重复的。
      

  7.   

    用substr(md5(uniqid(mt_rand(),1)), 10, 16);的话里面有字母的所以不行
      

  8.   

    同意aoenzh(独孤大虾)的意见,用时间来作,永远不会重复
      

  9.   

    xuzuning(唠叨) 好象否定了用时间的算法那应该怎么做呢?MD5吗?
      

  10.   

    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);
    ?>
    并再次检查是否有重复
      

  11.   

    <?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位的纯数字ID
    print_r($code->genID( 100, 16, 1));
    ?>
      

  12.   

    谢谢大家,最后通过ORACLE的序列来产生序列号的。HOHO实在是太偷懒了。