首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP随机字符串实际上不是随机字符串

PHP随机字符串实际上不是随机字符串
EN

Stack Overflow用户
提问于 2015-08-13 09:39:43
回答 4查看 327关注 0票数 1

我指的是PHP随机字符串生成器上答案中的函数(我已经删除了默认的$length参数)。

因此,此代码使用该函数,但由于某种原因,如果运行此代码,您将看到字符串在数组中多次出现!那么,如果这是真正随机的,我能产生这些结果吗?我需要修改一些东西来产生真正随机的字符串吗?

代码语言:javascript
复制
function generateRandomString($length) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $charactersLength = strlen($characters);
    $randomString = '';

    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, $charactersLength - 1)];
    }

    return $randomString;
}

$i = 0;
while ($i < 5000){
    $r = '';
    $r = generateRandomString(8);
    $arr[$r][$i] = $r;
    $i++;
}

foreach ($arr as $key=>$rand){
    if(count($rand) > 1){
        echo "$key has ".count($rand).' results<br>';
    }
}

举例结果:

代码语言:javascript
复制
ASCn2Db1 has 2 results
4ceXoUgh has 2 results
fCdzjEAV has 2 results
QRkXxAUJ has 2 results
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-08-13 10:03:38

实际上,我遇到了PHP:如何生成一个随机的、唯一的字母数字字符串?,它似乎回答了我的问题。简而言之,我们使用openssl_random_pseudo_bytes作为函数。当运行4个字符时,我得到了1x碰撞,但在5个字符上,我没有生成任何字符。所以8岁的时候我会没事的。

票数 0
EN

Stack Overflow用户

发布于 2015-08-13 09:45:56

随机并不是唯一的。掷出一个骰子,你就会多次得到相同的号码。

票数 2
EN

Stack Overflow用户

发布于 2015-08-13 15:30:49

我提供了对你在问题中提到的问题的回答,但是它被不安全的答案所掩盖,我并不奇怪每个人都会错过它。

代码中导致大量重复值的错误如下所示:

代码语言:javascript
复制
for ($i = 0; $i < $length; $i++) {
    $randomString .= $characters[rand(0, $charactersLength - 1)];
}

问题是rand()。如果你想要一个高质量的PHP随机字符串生成器,你需要使用一个更好的随机数发生器来驱动它。你在这里有三个不错的选择:

  • random_int() (仅限PHP 7+ )
  • 康帕特,它在PHP5项目(5.2+)中公开了一个兼容的random_int()接口。
  • RandomLib (PHP 5.3.2+)

TL;DR使用random_int()mt_rand().

即使使用安全的随机数生成器,如果您有短字符串和足够大的样本大小,由于生日问题,碰撞是不可避免的。。使用较长的字符串,它们就会少得多。

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

https://stackoverflow.com/questions/31984634

复制
相关文章

相似问题

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