0

이메일 등록 후 사용자가 핀을 생성하는 데 사용할 수있는 스크립트를 만들고 싶습니다. 핀은 6 자리 길이로 독특해야합니다. 두 명의 사용자가 동일한 핀을 사용할 수 없습니다.통계 brainteaser : 임의의 고유 한 6 자리 PIN을 만들고 확률 충돌을 최소화하기 위해 배포하는 방법

나는 다음 코드를 가지고 있지만, 무한 루프에서 멈추지 않고 계속 진행할 수는 없습니다. 더 많은 핀이 사용되면 while() 함수가 반복 될 확률이 높아집니다. 어느 누구도 이것에 대한보다 우아한 해결책을 알고 있습니까?

사용자는 핀을 사용하여 웹 사이트에서 무료 서비스를 이용할 수 있습니다. 사용자가 다른 핀을 추측해도 서비스 실패는 없지만 사용자 경험에 지장을줍니다.

가능한 경우 핀을 추측 할 확률이 통계적으로 무시할 수 있도록 PIN을 배포하고 싶습니다.

<?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> 
+0

미안하지만 임의의 고유 한 6 자리 숫자를 만드는 방법에 대해 얼마나 많은 수정 된 질문을 올리시겠습니까? – Anigel

+0

업데이트 된 코드이며, while() 함수를 사용하는 방법이 아니라 PIN을 배포 할 확률 및 확률입니다. – alias51

+1

인위적으로 제한적인 가능한 답변 세트가 아닌 패스워드를 사용하는 것만으로도 db의 핀에 고유 한 키를 직접 검사 할 수 있으므로 빠른 쿼리 여야합니다. 난수 생성과 고유 한 제약에 의존하는 한 엔트리 수가 증가함에 따라 항상 충돌이 더 많습니다. – Anigel

답변

0

은 당신이 당신의 접근 방식을 재고 할 수있는 댓글 중 일부에 동의합니다. 그러나 당신이 그것을 결정하고 수치 거리 (Levenshtein 거리와는 반대로)와의 친밀감을 해석한다면 Halton sequence 또는 다른 유사 무작위 순서의 사용을 고려할 수 있습니다. 위키 :

홀턴 서열은 염기로서 소수를 사용하는 결정 방법에 따라 구성된다. 간단한 예를 들어, 을 Halton 시퀀스의 한 차원을 2로하고 다른 하나를 3으로 만듭니다. 3 2에 대한 시퀀스를 생성하려면 간격 (0,1)을 절반으로 나눈 다음 4 분의 1로 나누십시오 , 8 번째 등을 생성하고, 생성하는 것은

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

이 상황을 상황에 맞게 적용하려면 시퀀스를 최대 PIN으로 곱하고 바닥을 차지하십시오. 이 접근법은 실제로 공간을 채우기 시작할 때까지 충돌을 발생시키지 않으며 PIN을 균등하게 분산시킵니다. 사용자 수가 귀하의 PIN 수보다 훨씬 적 으면 사용자가 다른 사용자의 PIN을 임의로 추측하기 어렵게 만들지 만, 사용하고있는 시퀀스를 찾으면 물론 전체 목록을 재현 할 수 있습니다.

관련 문제