Php 生成唯一的随机整数

Php 生成唯一的随机整数,php,random,integer,unique,Php,Random,Integer,Unique,我想用一个公共id创建用户帐户,该id始终是唯一的整数随机(不是增量)值 我可以使用循环检查随机整数是否唯一,但这似乎不是一个很好的解决方案 我发现了一些字母数字生成器,我想我可以使用字符串到整数的转换器将它们转换成整数,但是有一种特定于整数的方法吗 我还担心可能发生的冲突,但从长远来看,这种可能性似乎永远存在。(?您可以使用类似的本机php函数之一,也可以使用更可靠的方法,基于函数生成整数 为了确保值是唯一的,您可以在DB中的列上添加唯一索引,并编写“在重复更新时”查询,如果值不是唯一的,则会

我想用一个公共id创建用户帐户,该id始终是唯一的整数随机(不是增量)值

我可以使用循环检查随机整数是否唯一,但这似乎不是一个很好的解决方案

我发现了一些字母数字生成器,我想我可以使用字符串到整数的转换器将它们转换成整数,但是有一种特定于整数的方法吗


我还担心可能发生的冲突,但从长远来看,这种可能性似乎永远存在。(?

您可以使用类似的本机php函数之一,也可以使用更可靠的方法,基于函数生成整数


为了确保值是唯一的,您可以在DB中的列上添加唯一索引,并编写“在重复更新时”查询,如果值不是唯一的,则会向该值添加一些数字。有两种可能的解决方案:

1) 如果你的“长跑”真的很长,那就意味着这很长 可能,您的PHP_INT_MAX用完了,并且没有 只有整数特定的方式

2) 如果您还没有用完PHP_INT_MAX,那么您需要一些存储空间来存储 检查身份证

在1的情况下,您可以使用库。为了避免冲突,您需要在输入上增加一些计数器。然后可以将每个字母的字符串转换回整数


在2的情况下,您可以使用一些内存中的数据库,如redis来提高性能。

使用时间戳将非常有用,因为它使用时间来生成随机数。您还可以将下面的函数与其他随机生成的数连接起来

function passkey($format = 'u', $utimestamp = null){
    if (is_null($utimestamp)) {
        $utimestamp = microtime(true);  
    }

    $timestamp = floor($utimestamp);
    $milliseconds = round(($utimestamp - $timestamp) * 1000000);

    return date(preg_replace('`(?<!\\\\)u`', $milliseconds, $format),$timestamp);
}

echo passkey();  // 728362
函数密钥($format='u',$utimestamp=null){
如果(为空($utimestamp)){
$utimestamp=微时间(真);
}
$timestamp=地板($utimestamp);
$millizes=整数($utimestamp-$timestamp)*1000000);
返回日期(preg_replace)(`(?您可以使用带有大句号的

这是一个生成始终有6位数字的唯一整数的方法。它不会生成重复的整数,直到它生成了100000到996722之间的所有数字,这将为您提供近900000个不同的数字

条件是您可以向函数提供上次生成的编号。因此,如果您将编号存储在数据库中,您必须以某种方式检索上次分配的编号,以便将其提供给此函数:

function random_id($prev) {
    return 100000 + (($prev-100000)*97 + 356563) % 896723;
}

$prev = 100000; // must be a 6 digit number: the initial seed.
// Generate the first 10 pseudo-random integers.
for ($i = 0; $i < 10; $i++) {
    $prev = random_id($prev);
    echo $prev . "\n";
}
对于其他范围,您可以按照参考文章中关于在线性同余生成器中获取完整周期的规则来实现这一点。具体来说,如果您想要生成具有n个数字的数字,其中第一个数字不能为零(因此在10n-1和10n-1之间),那么我发现最容易找到刚好低于9的大素数⋅10n-1作为公式的最后一个数字。其他两个数字可以是任何正整数,但最好保持前一个小,以避免溢出

但是,PHP整数仅限于
PHP\u INT\u MAX
(通常为2147483647),因此对于具有10位或更多位的数字,您需要使用浮点运算符。此时不应使用
%
运算符。请改用
fmod

例如,要生成12位数的数字,可以使用以下公式:

function random_id($prev) {
    return 100000000000 + fmod((($prev-100000000000)*97 + 344980016453), 899999999981);
}

$prev = 100000000000; // must be a 12 digit number: the initial seed.
// Generate the first 10 pseudo-random integers.
for ($i = 0; $i < 10; $i++) {
    $prev = random_id($prev);
    echo $prev . "\n";
}
函数随机id($prev){
返回10000000000+fmod(($prev-10000000000)*97+344980016453),899999981);
}
$prev=10000000000;//必须是12位数字:初始种子。
//生成前10个伪随机整数。
对于($i=0;$i<10;$i++){
$prev=随机id($prev);
回显$prev。“\n”;
}

“我想制作……我可以转换它们”-所以,除非您需要指导或为您编写,否则请告诉我们您制作了什么;它是哪一个?如果我想要一个12位整数,应该更改什么?我添加了更多信息以生成n位数字,并提供了12位数字的代码。如果这个答案适合您的需要,请。最好使用实际的加密随机源,如。Rolling yo“你自己的随机数生成器是个好主意。”塔德曼,这个问题的要求不是生成加密随机数,而是(伪随机数)有一个完整周期的随机数,即,在生成所有可用的数之前,保证不会生成相同的数。显然,这使得在该周期结束时生成的数几乎不随机:你可以预测序列的最后一个。但这是这里的要求。问题不是这样说的s本身。它表示随机和唯一。任何足够随机的源在给定足够位的情况下都会有最小的冲突。64位值不太可能冲突。假设PRNG足够健壮,256位值可能永远不会冲突。
function random_id($prev) {
    return 100000000000 + fmod((($prev-100000000000)*97 + 344980016453), 899999999981);
}

$prev = 100000000000; // must be a 12 digit number: the initial seed.
// Generate the first 10 pseudo-random integers.
for ($i = 0; $i < 10; $i++) {
    $prev = random_id($prev);
    echo $prev . "\n";
}