1

我想要一些生成器脚本来生成唯一的数字,但不是以一种顺序。我们需要卖票。

例如目前的票号是这样的:

100000
100001
100002
...

这样用户就可以看到卖出了多少。

如何生成唯一编号?

例如:

151647
457561
752163
...

我可以使用随机数生成器,但是如果没有生成这样的数字,我总是会检查数据库。

嗯,也许在该列上使用索引时 - 检查不会花费很长时间。

仍然现在我必须得到最后一个卡号,如果我想给它加 1,但得到最后一个已经足够快了。

并且售出的门票越多,RNG 产生现有号码的机会就越大。因此,将来可能会进行更多检查。所以最好的办法是取最后一个数字并由它生成下一个。

4

5 回答 5

3

这是一种打乱票号的简单方法(注意:您需要 64 位 PHP,或更改代码以使用该bcmath库):

function scramble($number) {
    return (305914*($number-100000)+151647) % 999983;
}

看,输出甚至看起来像你的例子:

Input     Output
------    ------
100000    151647
100001    457561
100002    763475
100003    069406

如果您愿意,可以将其反转,因此您可以在 URL 中使用这些代码,然后恢复原始号码:

function unscramble($number) {
    return (605673*($number-151647)+100000) % 999983 ;
}

这安全吗?可以访问许多序列号的人可以找到该模式,因此如果票号非常敏感,请不要使用此模式。

于 2013-08-21T12:12:11.133 回答
1

生成随机数,使票号唯一索引,插入新票的记录,如果失败则表示发生了冲突,因此必须生成另一个id。使用良好的随机空间,比如 32 位整数,碰撞的机会是最小的。如果列是索引和数值,则后面的 SQL 实现速度非常快。

于 2013-08-21T11:47:58.313 回答
0

您可以生成您的号码,存储在一个池中,当您需要新号码时,使用池的 RNG 索引获取一个,从池中删除并返回它。

如果池几乎用完,只需生成另一批

于 2013-08-21T11:38:49.650 回答
0

最简单的方法,你可以简单地使用 md5() 函数..

并得到一个 6 位数的字符串,你可以做

$x = md5(microtime());

echo substr($x, 0, 6);

编辑:

session_start();

    $x = md5(microtime().session_id());

    echo substr($x, 0, 6);
于 2013-08-21T11:42:11.980 回答
0
 function generateCode() {



    $chars = '01234567890';
    do {
            $code = '';
            for ($x = 0; $x < 6; $x++) {
                $code .= $chars[ rand(0, strlen($chars)-1) ];
            }

如果之前生成了此代码,您可以在数据库中查看此处,如果是,则返回;

  } while (true);

    return $code;

    }
于 2013-08-21T11:45:09.583 回答