我怎样才能生成一个永远不再相同(重复)PHP的数字

时间:2012-03-31 14:17:26

标签: php codeigniter numbers

  

可能重复:
  Algorithm for generating a random number

是否可以生成一个永不重复的随机数?

php中有解决方案吗?还是codeIgniter?

例如,如果我需要为每个用户生成一个随机的从不重复的id,我怎么能确定没有用户具有相同的id?

7 个答案:

答案 0 :(得分:3)

使用此:http://php.net/manual/en/function.uniqid.php

<?php
/* A uniqid, like: 4b3403665fea6 */
printf("uniqid(): %s\r\n", uniqid());

/* We can also prefix the uniqid, this the same as 
 * doing:
 *
 * $uniqid = $prefix . uniqid();
 * $uniqid = uniqid($prefix);
 */
printf("uniqid('php_'): %s\r\n", uniqid('php_'));

/* We can also activate the more_entropy parameter, which is 
 * required on some systems, like Cygwin. This makes uniqid()
 * produce a value like: 4b340550242239.64159797
 */
printf("uniqid('', true): %s\r\n", uniqid('', true));
?>

答案 1 :(得分:2)

您需要多少这些数字?如果您需要无限数量的唯一号码,您可能还需要无限的空间来存储这样的号码。

如果您只想要特定范围内的数字,例如0到20亿,您可以确保通过存储整个范围并将其随机化,只使用这些数字中的每一个。然后,每次需要一个数字时,增加上次使用的索引以获得下一个数字。当您达到最高索引时,生成新范围,或者只重复使用相同范围。

这个解决方案只需要花费8GB的数据就可以获得20亿个数字,保证彼此之间是独一无二的。

但是,正如您可以想象的那样,通常有更好的解决方案,也许您可​​以使用不太独特的数字,时间戳,甚至只是递增的计数器。

如果要将用户存储在数据库中,则可以使数据库为您生成唯一的用户ID。这将是一个不断递增的整数。如果您使用auto_increment int字段,则不会很快达到userid的限制。

答案 2 :(得分:1)

  

我如何确定没有用户拥有相同的ID?

检查某些用户是否已拥有它?

答案 3 :(得分:1)

你的问题的简单答案是明确的否定。如果它必须是完全随机的,则在100%概率方面永远不会是唯一的。

您可以生成长而复杂的随机令牌,并且可以承担非唯一性的小风险,或者您必须在生成后检查数据库中的唯一性。

但正如其他人所说,你很可能只是要求解决已经解决的问题。这意味着您应该在数据库表中使用自动递增的主索引来确保唯一记录。

答案 4 :(得分:1)

要创建一些独特的东西,你基本上需要一个唯一的字符串来开始,可能是一个来自数据库甚至是microtime(true)的自动递增值, 也许如果您使用用户名或电子邮件等方式检查唯一性,那么如果您没有来自数据库的自动递增值,请使用它。

这是一个快速无用的函数,它将字符串扩展为更独特的值sha1,然后获取sha1字符串的crc校验和。并将其填充到最大len 它更像是abit overkill,因为你可以用000001,000002填充值,但那里的乐趣。

<?php 
function make_user_id($id,$lenth=10){
    return str_pad(substr(sprintf("%u", crc32(sha1($id))),0,$lenth), $lenth, "0", STR_PAD_LEFT);
}

//mysql_insert_id() or something unique from user, pahaps an email address or name
//example
foreach(range(1,25) as $id){
    $array[]=make_user_id($id,10);
}
sort($array);

print_r($array);
/*
Array
(
    [0] => 0299258281
    [1] => 0361369892
    [2] => 0391093287
    [3] => 0422444891
    [4] => 0492247561
    [5] => 0642853861
    [6] => 0737524653
    [7] => 0860628658
    [8] => 0944014851
    [9] => 1054358011
    [10] => 1065666469
    [11] => 1194536188
    [12] => 1390882148
    [13] => 1617647885
    [14] => 1648921238
    [15] => 2611355852
    [16] => 2612669788
    [17] => 2615382585
    [18] => 3526511484
    [19] => 3578384747
    [20] => 3888148475
    [21] => 4095122425
    [22] => 4197940240
    [23] => 4288076077
    [24] => 4293497861
)*/
?>

答案 5 :(得分:0)

显然,由于每个表单通常都是从相同的算法生成的,所以总有一个数字的机会。

最安全的方法是检查您的数据库,以确保,如果已经采用了ID:

$id = "1"; //Your id to check
$query = "SELECT * FROM table where id=?";
$result = mysql_query($query);
if(mysql_num_rows($result)) { 
  //the id is present
}

如果你改用mysqli

会更好
$id = "1"; //Your id to check
$query = "SELECT * FROM table where id=?";
$stmt = mysqli_prepare($link, $query);
mysqli_stmt_bind_param($stmt, "i", $id);
mysql_stmt_execute($stmt);
if(mysql_stmt_num_rows($stmt))
  //the id is present
}  
mysqli_stmt_close($stmt);

答案 6 :(得分:0)

bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM))

将生成带有数字和字母的随机字符串(我将其用于密码盐)。 从http://crackstation.net/hashing-security.html开始,请阅读此内容。