首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >统计脑筋急转弯:如何创建随机唯一的6位PIN并分发以最小化碰撞概率

统计脑筋急转弯:如何创建随机唯一的6位PIN并分发以最小化碰撞概率
EN

Stack Overflow用户
提问于 2013-07-23 03:14:09
回答 1查看 379关注 0票数 0

我想创建一个脚本,用户可以用它来生成一个引脚,注册后的电子邮件。pin必须为6位数且唯一;任何两个用户都不能拥有相同的pin。

我有下面的代码,但是还没能走出陷入无限循环。随着引脚的使用越来越多,使while()函数循环的概率也随之增加。有没有人有更好的解决方案呢?

用户使用他们的个人识别码从网站获取免费服务。如果用户猜到了另一个pin,服务不会失败,但这会破坏用户体验。

如果可能,我希望以这样一种方式分发pin,即从统计上讲,猜测pin的概率可以忽略不计。

代码语言:javascript
复制
<?php
if($_POST['srSubmit'] && $_POST['srEmail'] && $_POST['srPass']) {
    $conn = mysqli_connect('localhost','root','','db_test');
    while(1) {
        $pin = rand(111111,999999);
        $sel = mysqli_query($conn,"SELECT * FROM formusers WHERE pin = '$pin'");
        if(mysqli_num_rows($sel) != 0) {    continue; }

        mysqli_query($conn,"INSERT INTO formusers(email,password,pin) VALUES('".$_POST['srEmail']."','".$_POST['srPass']."','".$pin."')");
        if(mysqli_affected_rows($conn)!=-1)  {
            echo "Pin:" . $pin;
            exit;
        } else {
            echo "Existing email, try again<br />";
        }
        break;
    }

}
?>
<form method="POST" action="">
<input type="email" name="srEmail" value="" placeholder="Email" /><br />
<input type="password" name="srPass" value="" placeholder="Password" /><br />
<input type="submit" name="srSubmit" value="Register" />
</form>
EN

回答 1

Stack Overflow用户

发布于 2013-07-25 14:01:53

我同意一些评论者的观点,即您可能需要重新考虑您的方法。但是,如果您决定使用它,并且如果您用数字距离(例如,与Levenshtein距离相反)来解释接近度,那么您可以考虑使用Halton sequence或其他准随机序列。来自维基百科:

根据一种使用质数作为基数的确定性方法来构造Halton序列。举个简单的例子,让我们假设Halton序列的一个维度基于2,另一个维度基于3。要生成2的序列,我们首先将间隔(0,1)一分为二,然后将间隔(0,1)分成四分、八分等,从而生成

1⁄2,1⁄4,3⁄4,1⁄8,5⁄8,3⁄8,7⁄8,1⁄16,9⁄16,...

要将此想法应用于您的情况,只需将序列乘以您的最大PIN,然后发言。这种方法不会产生碰撞,直到你真正开始填满你的空间,并均匀地分散你的引脚。这将使用户很难随机猜测其他用户的PIN,只要您的用户数量比您的PIN数量少得多,但如果有人发现您使用的序列,他们当然可以重新生成完整的列表。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17795570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档