$_order_id = date('YmdHis') . rand(100000,999999);
//这样的订单号应该不会有重复的,又方便,前面还能看出时间来

解决方案 »

  1.   


    需求要求,非要在1-10万之间的数那你还是用原子性的redis自增吧
      

  2.   


    需求要求,非要在1-10万之间的数那你还是用原子性的redis自增吧我没有描述清楚,补充下吧,定单号要在1-10万之间。  定单号不能 递增或递减的生成,一定要随机的,只要在1-10万之间随机,如果随机的过程中产生连号不用处理
      

  3.   

    可以自己写一个伪随机数发生器
    先观察$m = 100000;
    $c = 101;
    $b = 81;
    $n = 0;
    for($i=0; $i<100000; $i++) {
      $n = ($n * $c + $b) % $m;
      $r[] = $n;
    }
    print_r(array_count_values(array_count_values($r)));
    Array
    (
        [1] => 100000
    )
    可知 $r 中保有 0 - 99999 随机排列的数字,且每个数字只会出现一次令 $n  为最后一次入库的号码,则 ($n * $c + $b) % $m 一定就不在库中希望你能理解
      

  4.   

    先查询没有使用的订单号总量,然后随机数最大值就设它,随到多少,你就limit多少
      

  5.   

    线性同余法  线性同余方法是目前应用广泛的伪随机数生成算法,其基本思想是通过对前一个数进行线性运算并取模从而得到下一个数。即:
    a(i+1)=(a(i)*b+c)mod(m)
    其中b称为乘数,c称为增量,m称为模数,它们均为常数。乘数、增量和模数的选取可以多种多样,只要保证产生的随机数有较好的均匀性和随机性即可。
    线性同余法的最大周期是m,但一般情况下会小于m。要使周期达到最大,应该满足以下条件:
    (1) c和m互质;
    (2) m的所有质因子的积能整除b-1;
    (3) 若m是4的倍数,则b-1也是;
    (4) b,c,a(0)(初值,一般即种子)都比m小;
    (5) b,c是正整数。经过耐心的筛选,可以找到使绝对均匀的b和carray_count_values(array_count_values($r)) 中
    array_count_values($r) 得到一个数组,保存有$r中每个值出现的次数
    再次统计得
    Array
    (
        [1] => 100000
    )
    可知这十万个数是不重复的
      

  6.   

    $_order_id = date('YmdHis') . rand(1000,9999);