使用uniqid()获取客户参考号

时间:2013-11-19 10:55:58

标签: php uniqueidentifier

我正在尝试根据this answer为客户和订单创建参考号,并满足以下要求:

  • 所有数字
  • 唯一(尽可能不检查数据库
  • 相同长度
  • 客户从10开始
  • 订单以20
  • 开头

以下是我目前为客户提供的代码:

$ref = uniqid();
$decimalRef = hexdec($ref);
$finalRef = 10 . $decimalRef;

这是一个很好的解决方案吗?我担心独特性,不确定它们的长度是否总是一样。

更新

我不想使用数据库自​​动增量值,因为我不想事先写入数据库,我不希望我的客户知道他们是我的客户编号2.显而易见的原因。

更新2

如果我要使用数据库自​​动增量值,我该如何根据要求将其转换为更合适的面向客户的数字(相同的长度,从10开始)。如果我在系统中只有4个订单,我不想向我的用户宣布。

3 个答案:

答案 0 :(得分:0)

你可以试试这个。我不确定这个的独特性,但是正在形成我。

// Generate a random character string
    function rand_str1($length = 8, $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890',$type)
    {
        // Length of character list
        $chars_length = (strlen($chars) - 1);

        // Start our string
        $string = $chars{rand(0, $chars_length)};

        // Generate random string
        for ($i = 1; $i < $length; $i = strlen($string))
        {
            // Grab a random character from our list
            $r = $chars{rand(0, $chars_length)};

            // Make sure the same two characters don't appear next to each other
            if ($r != $string{$i - 1}) $string .=  $r;
        }

        // Return the string
        if($type=="Customers")
        {
        return "10".$string."";
        }
        else if($type=="Orders")
        {
        return "20".$string."";
        }
    }

答案 1 :(得分:0)

好的,为了确保参考号是唯一的,我应该使用自动增量数据库ID,而不是自己创建。

答案 2 :(得分:0)

  

uniqid()函数根据microtime

生成唯一ID

这意味着如果你可以确保没有uniqid生成的并发请求,那么在那个服务器上就可以了(因为它基于系统的时间)。

我的建议是将它与任何用户会话ID或用户ID组合(如果它们可用),因为可以安全地假设没有一个用户可以同时发出两个并发请求。

"10". hexdec(uniqid()).$userId ;//or hexdec(session_id()) instead of $userId

<强>更新: 我担心hexdec函数会为Int类型返回一个太大的值。这实在是太过分了。如果唯一关注的是订单号,可以在订单号前加上时间戳或类似名称,或者使自动续约从2000开始而不是0。