我正在尝试根据this answer为客户和订单创建参考号,并满足以下要求:
以下是我目前为客户提供的代码:
$ref = uniqid();
$decimalRef = hexdec($ref);
$finalRef = 10 . $decimalRef;
这是一个很好的解决方案吗?我担心独特性,不确定它们的长度是否总是一样。
更新
我不想使用数据库自动增量值,因为我不想事先写入数据库,我不希望我的客户知道他们是我的客户编号2.显而易见的原因。
更新2
如果我要使用数据库自动增量值,我该如何根据要求将其转换为更合适的面向客户的数字(相同的长度,从10开始)。如果我在系统中只有4个订单,我不想向我的用户宣布。
答案 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。