PHP内部实现打乱字符串顺序函数str_shuffle的方法

前言

2019年春节已过,今天是上班第一天,还得翻一翻之前没有看完的PHP源码。

今天聊的是字符串顺序打乱函数str_shuffle。这个函数本身使用频率并不高。但是,其内部实现还是非常有趣的。

str_shuffle() 函数随机地打乱字符串中的所有字符。

要注意,打乱的是字符串中的“字符”

  • 一个字母等于一个字符
  • 一个汉字等于2个字符

自己实现

如果在没有看PHP源码内部实现之前,如果使用php实现内部字符串打乱顺序的操作,我能想到的是下面几种方式。

循环随机数

使用随机数,可以有随机取字符串的字符拼接,或者顺序取出,放到随机数自定的位置。这两种方式都涉及到随机数重复的情况,需要去重。

这种方式的重点在于生成不重复的随机数。

切分成数组然后打乱顺序

用数组打乱顺序的方式实现其实是有些“作弊”嫌疑。

PHP内部实现

来看看PHP内部如何实现。

其实PHP内部也是使用随机数实现,但是他的巧妙之处在于使用随机数抽取字符串与一个特定的字符串(最后一个)进行替换。这样就不用去考虑随机数重复的问题。不会因为重复到账一些字符串被覆盖。

文章开始的随机数抽取,不能保证经过n次后结束,因为需要跳过随机数重复的情况。但是php内部的实现,都是n次循环后结束。在性能上肯定比需要去重的随机数方法要好。

两个方法的出发点都一样,但是稍微的不一样就可以带来很大的提升。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • php使用str_shuffle()函数生成随机字符串的方法分析

    本文实例讲述了php使用str_shuffle()函数生成随机字符串的方法.分享给大家供大家参考,具体如下: str_shuffle():随机打乱字符串的顺序. 可以通过str_shuffle()函数与substr()函数的组合,生成每次都不一样的字符串. 以下是str_shuffle()函数的两个示例: 示例一:随机生成长度为10位数字的字符串. $str="QWERTYUIOPASDFGHJKLZXCVBNM1234567890qwertyuiopasdfghjklzxcvbnm"

  • PHP内部实现打乱字符串顺序函数str_shuffle的方法

    前言 2019年春节已过,今天是上班第一天,还得翻一翻之前没有看完的PHP源码. 今天聊的是字符串顺序打乱函数str_shuffle.这个函数本身使用频率并不高.但是,其内部实现还是非常有趣的. str_shuffle() 函数随机地打乱字符串中的所有字符. 要注意,打乱的是字符串中的"字符" 一个字母等于一个字符 一个汉字等于2个字符 自己实现 如果在没有看PHP源码内部实现之前,如果使用php实现内部字符串打乱顺序的操作,我能想到的是下面几种方式. 循环随机数 使用随机数,可以有随

  • python中根据字符串调用函数的实现方法

    在python中可以根据字符串来调用函数: 1.使用getattr从字符串来调用函数 在多进程中,可能传递过来的是一个字符串,那么我怎么来调用一个已经存在的函数呢,主要就是使用到getattr函数的作用,这个函数就是在使用字符串得到这个字符串对应的函数的对象,然后就可以进行执行,如下所示: 在模块中,存在两个函数: [root@python 530]# cat attr.py #!/usr/bin/env python def kel(): print 'this is a kel functi

  • JavaScript通过字符串调用函数的实现方法

    本文实例讲述了JavaScript通过字符串调用函数的实现方法.分享给大家供大家参考.具体分析如下: JavaScript中我们可以把根据函数名的字符串来调用函数,这样我们就可以实现动态函数调用,只需要传递一个函数的名字即可调用该函数. 复制代码 代码如下: var strFun = "someFunction"; //Name of the function to be called var strParam = "this is the parameter";

  • c语言中字符串分割函数及实现方法

    1.问题引入 自己在写一个linux下的模拟执行指令的时候,遇到了输入"cat a.c",要将该字符串分解成cat和a.c两个单独的字符串,虽然知道有strtok的存在,但是想自己尝试写一下,于是就自己写了一个,不过总是遇到这样或那样的问题,虽然最后调通了,不过确浪费了不少时间:后来作业交上去以后又仔细阅读了strtok函数,发现原来linux下已经改成strsep,所有在这里就写一下自己所走的过程. 2.自己写的字符串分割函数:用于分割指令,比如cat a.c最后会被分割成cat和a

  • js 把字符串当函数执行的方法

    并且用js去执行: function test(str){ alert(str); } window['test']('aaaaaaaaaaaaaaaaaaaaa'); [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行] ------------------------------- 方法一... function test(str){ alert(str); } eval('test("aaaaaaaaaaaaaaaaaaa")'); [Ctrl+A 全选 注:如需引入外部J

  • 浅析python 内置字符串处理函数的使用方法

    一.lower():将大写字母全部转为小写字母.如: 复制代码 代码如下: name='G'b=name.lower() 二.title"":将字符串转化为标题,即所有单词的首字母大写,其他字母小写.使用方法同lower() 三.replace:返回某字符串的所有匹配项均被替换之后得到的字符串. 复制代码 代码如下: 'This is a test'.replace('is','are') 四.split:将字符串分割成序列 复制代码 代码如下: '1+2+3+4+5'.split('

  • js下将字符串当函数执行的方法

    复制代码 代码如下: //测试函数 function test(str){ alert(str); } // 方法一 window["test"]("方法一"); // 方法二 eval('test("方法二")');

  • 详解C语言对字符串处理函数的实现方法

    目录 strlen: 1.计数器版本: 2.递归的版本 3.指针-指针版本 strcat: strcmp: 总结 strlen: 1.计数器版本: #include<stdio.h> #include<string.h> #include<assert.h> int my_strlen(const char *str) { int count =0; assert(str!=NULL); while(*str!='\0') { count++; str++; } ret

  • C语言实现字符串操作函数的实例

    C语言实现字符串操作函数的实例 在编写程序的过程中,我们经常使用到一些字符串函数,例如求字符串长度,拷贝字符串--,这些函数都在C标准库中存在,我们可以直接使用.但我们还需要掌握这些函数的实现方法,今天来看看一些常用的字符串操作函数的实现方法. 1.strlen strlen是用来求字符串长度的函数,字符串长度就是它所包含的字符个数. 今天给大家介绍三种实现strlen函数的方法 (1)定义一个计数器count //方式一:定义一个计数器 size_t my_strlen(const char

  • PHP常用字符串操作函数实例总结(trim、nl2br、addcslashes、uudecode、md5等)

    本文实例总结了PHP常用字符串操作函数.分享给大家供大家参考,具体如下: /*常用的字符串输出函数 * * echo() 输出字符串 * print() 输出一个或多个字符串 * die() 输出一条信息,并退出当前脚本 * printf() 输出格式化字符串 * sprintf() 把格式化的字符串写入到一个变量中 * */ //ucfirst //将字符串中的首字母转换为大写 $str="string"; echo ucfirst($str); echo "<hr&

随机推荐