首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP -如何创建安全的10位键

PHP -如何创建安全的10位键
EN

Stack Overflow用户
提问于 2014-12-22 20:21:33
回答 2查看 243关注 0票数 0

好吧,我需要一种方法来创建一个随机的、唯一的10位键,这个键与下面的模式相匹配:

LLNNNLLNNN

其中L是字母,N是数字。

我已经找到了解决办法,但我正在寻求一些明智的意见。我的解决方案是(php):

代码语言:javascript
复制
        $alhpabet = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','X','W','Y','Z']; //26 letras         
        $transaction_id = ''; //string

        //Two first letters
        $transaction_id .= $alhpabet[secure_random_number(0,25)];
        $transaction_id .= $alhpabet[secure_random_number(0, 26)];
        //3 first numbers (3 digits)
        $transaction_id .= str_pad(secure_random_number(0, 999),3,'0',STR_PAD_LEFT);
        //last letters
        $transaction_id .= $alhpabet[secure_random_number(0,25)];
        $transaction_id .= $alhpabet[secure_random_number(0, 26)];
        //last numbers
        $transaction_id .= str_pad(secure_random_number(0, 999),3,'0',STR_PAD_LEFT);

我生成secure_random_number的功能是:

代码语言:javascript
复制
function secure_random_number($min, $max){
$range = $max - $min;
if($range == 0)
    return $min; // not so random...
$log = log($range, 2);
$bytes = (int) ($log / 8) + 1; // length in bytes
$bits = (int) $log + 1; // length in bits
$filter = (int) (1 << $bits) - 1; // set all lower bits to 1
do{
    $rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes, $s)));
    $rnd = $rnd & $filter; // discard irrelevant bits
}while($rnd >= $range);
return $min + $rnd;
}

ps:我在这里的某个地方弄到了这个,但忘了注意信贷.

注意:,我不担心性能。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-22 21:09:06

作为一般的经验规则,当样本数(数据库项)接近键总数的平方根时,键冲突就很可能发生。想想生日的问题:即使是一个只有23人的房间,也会有两个人的生日-- 50%的时间是一样的,因为23 >平方米(365.25)。

您的密钥方案只有456,976,000,000值(26 ** 4* 10 ** 6)。那是676,000平方米。这意味着,即使数据库中只有大约50万项,您也可能会发生冲突。你如何选择它们是完全不相关的。

票数 2
EN

Stack Overflow用户

发布于 2014-12-22 21:28:17

一直都是算法迷。下面是一个您可能想要的递归广义变体:

代码语言:javascript
复制
function gencode($pattern) {
  if ($key = substr($pattern, 0, 1)) {
      $code = ($key == 'L') ? chr(rand(65, 90)) : rand(0, 9);
      return $code.gencode(substr($pattern, 1));
  } else return null;
}

echo gencode('LLNNNLLNNN');

函数gencode将取任意长度的任意模式,并根据L和N的模式生成随机码。

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

https://stackoverflow.com/questions/27609859

复制
相关文章

相似问题

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