首页 > 编程语言 >PHP关于随机打乱字符串函数str_shuffle会出现重复的问题

PHP关于随机打乱字符串函数str_shuffle会出现重复的问题

时间:2024-03-29 19:02:21浏览次数:35  
标签:随机数 shuffle 函数 重复 str 字符串 PHP

    某次在线上排查问题时发现,代码中使用的一个使用str_shuffle随机打乱字符串函数生成的唯一字符出现了重复,导致插入数据库失败。觉得很奇怪,生成随机字符串的方法如下:

function makeString($len)
{
    $char = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    return substr(str_shuffle($char), 0, $len);
}

    从php的手机中看到,str_shuffle函数在php7.1.0中有所变化,其内置的随机算法从 libc rand 函数改成了梅森旋转演伪随机数发生算法。

    但不知道和我这有没有关系,我使用的php版本也正是7.1.0。但在线上环境中确实是出现了生成的字符重复的问题,而我在自己的环境和服务器的环境中使用脚本检测重复的情况却也没有再复现。示例脚本如下:

#检测重复率
$data =array();
for($i=0;$i<=50000;$i++){
    $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $data[] = substr(str_shuffle(str_repeat($pool,32)), 0, 32);
}
$new = array_count_values($data);
echo '<pre>';
print_r(array_filter($new, function($var){
    return($var>1);
}));

    有说str_shuffle函数的PHP内部实现也是使用随机数(PHP内部如何实现打乱字符串顺序函数str_shuffle-腾讯云开发者社区-腾讯云),它使用随机数抽取字符串与一个特定的字符串(最后一个)进行替换。这样就不用去考虑随机数重复的问题。不会因为重复到账一些字符串被覆盖。

    可以自定义函数对生成的随机字符串进行存在性判断,但这样不能保证经过n次后结束,因为需要跳过随机数重复的情况。但str_shuffle函数在php内部的实现,都是n次循环后结束。在性能上肯定比需要去重的随机数方法要好。str_shuffle函数内部实现如下(强调下这张图不是我原创的):

    目前尚未找到出现此问题的底层原因,我使用了unquid方法进行了替代目前解决了问题,代码如下:

#使用uniqid生成唯一ID,使用随机数区分多台服务器
function makeString($len)
{
    return md5(uniqid(mt_rand(0,10000)));
}

    此外php中除了str_shuffle函数可对字符串进行打乱外,还有一个shuffle函数可以用来快速打乱数组,不过其使用的是伪随机数产生器,并不适合密码学的场合。

    str_shuffle函数和shuffle的返回值稍微有点区别,str_shuffle函数返回一个新的长度符合的字符串,而shuffle只返回true或false这个处理结果,修改的是原数组本身。

标签:随机数,shuffle,函数,重复,str,字符串,PHP
From: https://blog.csdn.net/weixin_47792780/article/details/137153894

相关文章

  • KingbaseES V8R6集群运维案例之---级联备库upstream节点故障
    KingbaseESV8R6集群运维案例之---级联备库upstream节点故障案例说明:在KingbaseESV8R6集群,构建级联备库后,在其upstream的节点故障后,级联备库如何处理?适用版本:KingbaseESV8R6集群架构:案例一:一、配置集群的recovery参数(allnodes)Tips:关闭备库的aut-recovery机制......
  • A TL Strategy for Improving the Data Efficiency of DRL Control
    Paper1ATransferLearningStrategyforImprovingtheDataEfficiencyofDeepReinforcementLearningControlinSmartBuildings:https://ieeexplore.ieee.org/document/10454120MotivationRL算法需要大量数据用于学习,我们需要提高训练和数据利用的效率。TL方法是一......
  • SHUFFLE 洗牌
    [AHOI2005]洗牌传送门题目描述为了表彰小联为Samuel星球的探险所做出的贡献,小联被邀请参加Samuel星球近距离载人探险活动。由于Samuel星球相当遥远,科学家们要在飞船中度过相当长的一段时间,小联提议用扑克牌打发长途旅行中的无聊时间。玩了几局之后,大家觉得单纯玩扑克牌......
  • PHP 将数字转换为汉字
     header("Content-type:text/html;charset=utf-8");functiongetNumber($num){   $arr=array('零','壹','贰','叁','肆','伍','陆','柒','捌','玖');   $cny=......
  • 万字详解PHP+Sphinx中文亿级数据全文检索实战(实测亿级数据0.1秒搜索耗时)
    Sphinx官方文档:http://sphinxsearch.com/docs/sphinx3.html极简概括:由C++编写的高性能全文搜索引擎的开源组件,C/S架构,跨平台(支持Linux、Windows、MacOS),支持分布式部署,并可直接适配MySQL。解决问题:因为MySQL的like%keyword%不走索引,且全文索引不支持中文,所以需要借助其它......
  • Php_Code_challenge15
     题目:答案: 解析:对'..'进行限制禁止我们包含其他目录下的内容,也就不能对服务器日志及SESSION进行利用,我们对分析代码分析出题人贴心的给我们输出了上传后的文件名及路径,并且利用file_put_contents和file_get_contents进行文件的写入,这是很危险的输出上传文件名加上file_p......
  • H. Impartial Strings
    H.ImpartialStringsProblem-H-Codeforces抽象场不传题解......
  • Large Language Models As Evolution Strategies
    本文是LLM系列文章,针对《LargeLanguageModelsAsEvolutionStrategies》的翻译。作为进化策略的大型语言模型摘要1引言2相关工作3背景4将LLMS转化为ES算法5LLMS作为零样本进化策略6EVOLLM消融研究7EVOLLM与教师微调8讨论摘要大型Transformer模......
  • JavaScript快速入门笔记之七(String:字符串类型、RegExp:正则表达式)
    JavaScript快速入门笔记之七(String:字符串类型、RegExp:正则表达式)String:字符串类型什么是字符串?底层本质:一串字符组成的只读字符数组包装类型:临时封装原始类型数据,并提供对数据操作方法的对象——类型名和原始类型名相同!StringNumberBoolean何时使用:不必手动创建!......
  • R语言广义线性混合模型(GLMM)bootstrap预测置信区间可视化
    全文链接:https://tecdat.cn/?p=35552原文出处:拓端数据部落公众号通过线性模型和广义线性模型(GLM),预测函数可以返回在观测数据或新数据上预测值的标准误差。然后,利用这些标准误差绘制出拟合回归线周围的置信区间或预测区间。置信区间(CI)的重点在于回归线,其可以解释为(假设我们绘制的......