如何使“uniqid”只生成数字?

7
我有以下代码,是我从不同的教程示例中组合而成的:
<?php

$stamp = date("Ymdhis");
$random_id_length = 6;
$rndid = crypt(uniqid(rand(),1)); 
$rndid = strip_tags(stripslashes($rndid)); 
$rndid = str_replace(".","",$rndid); 
$rndid = strrev(str_replace("/","",$rndid));
$rndid = substr($rndid,0,$random_id_length); 
$orderid = "$stamp-$rndid";
$orderid = str_replace(".", "", "$orderid");
echo($orderid);

?>

FIDDLE: http://phpfiddle.org/main/code/27d-qfw

我希望这个代码能够生成一个数字,包括当前时间和6位随机数。

例如:20130710045730-954762

然而,目前的随机数也包含字母。

例如:20130710045730-Z3sVN2

我该如何修改代码只包括数字?感谢您的帮助。


只是将字母映射到数字吗? - SH-
你可以使用 str_pad(rand(0,999999),6, "0", STR_PAD_LEFT),在同一秒内发布的帖子发生冲突的概率是百万分之一。 - Orangepill
4个回答

34

uniqid()已经返回数字,但是以十六进制表示。通常情况下,您可以将它们转换为十进制数:

uniqid()将已经返回数字,但是以它们的十六进制表示方式呈现。一般来说,您可以将它们转换为十进制数:

echo hexdec(uniqid());

这个值只有在 64 位系统上才有意义,因为它非常大,超出了 32 位有符号整数的限制(例如 PHP 的一个)。这就是关键点。uniqid() 使用这样的大数字和其他技术来确保高度唯一性。 如果您仅使用 6 个数字,则不能再保证这一点。 值冲突的风险将很高。

我建议使用数据库中的自动增量值或类似的东西来生成应用程序范围内的唯一性。


5
如果是随机字符串,请使用类似以下的内容:
$stamp = date("Ymdhis");
$random_id_length = 6;
$rndid = generateRandomString( $random_id_length );

$orderid = $stamp ."-". $rndid;
echo($orderid);

function generateRandomString($length = 10) {
  $characters = '0123456789';
  $randomString = '';
  for ($i = 0; $i < $length; $i++) {
    $randomString .= $characters[rand(0, strlen($characters) - 1)];
  }
  return $randomString;
}

// Output example: 20130710055714-462231

示例:http://codepad.org/eukiOb6S

Fn修改自https://dev59.com/3W855IYBdhLWcg3waDiR#4356295


谢谢!那很完美 :-) - Chris
完全没有问题!如果您发现答案是正确的,请为未来的用户标记它为正确,谢谢! - DACrosby

0

使用这个:

str_pad(rand(0,'9'.round(microtime(true))),11, "0", STR_PAD_LEFT); 

3
为什么这会有效以及为什么 OP 没有理解正确的进一步解释。 - NSNoob
请访问此链接以获取更多详细信息:[http://php.net/manual/en/function.str-pad.php]。round(microtime(true))总是调用微秒。 - Jasveer Singh

0

使用这段代码。我认为这会有所帮助。

rand(100000,999999)

输入您想要的数字位数的两个数字


我认为两者是相同的 @ceejayoz - r.vengadesh
1
http://php.net/mt_rand说它至少要快得多,并使用已知的随机特性。应该使用它来代替`rand()`。 - ceejayoz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接