1. php的count(数组)和strlen(字符串)的内部实现。
翻了下PHP内核的定义,大概心中也有了答案了
count()和strlen()都是O(1)的时间复杂度
试想一下如果strlen()需要O(N)的复杂度那未免也太慢了,字符串长度起来的话服务器不是要直接挂掉吗
这两个函数都是典型的空间换时间的做法
我们可以先看看zvalue的结构:
typedefunion_zvalue_value{
longlval;/*longvalue*/
doubledval;/*doublevalue*/
struct{
char*val;
intlen;
}str;
HashTable*ht;/*hashtablevalue*/
zend_object_valueobj;
zend_ast*ast;
}zvalue_value;
这里用的是一个联合体,当变量类型是string类型的时候附加存储多了一个len的整型变量,显而易见需要取长度直接利用记录值就可以了,自然就是O(1)
对于count()常用的参数类型应该为数组,对于继承Countable的类暂不作讨论
数组实现方式为Hashtable,直接看看他的结构吧
typedefstruct_hashtable{
uintnTableSize;//hashBucket的大小,最小为8,以2x增长。
uintnTableMask;//nTableSize-1,索引取值的优化
uintnNumOfElements;//hashBucket中当前存在的元素个数,count()函数会直接返回此值
ulongnNextFreeElement;//下一个数字索引的位置
Bucket*pInternalPointer;//当前遍历的指针(foreach比for快的原因之一)
Bucket*pListHead;//存储数组头元素指针
Bucket*pListTail;//存储数组尾元素指针
Bucket**arBuckets;//存储hash数组
dtor_func_tpDestructor;//在删除元素时执行的回调函数,用于资源的释放
zend_boolpersistent;//指出了Bucket内存分配的方式。如果persisient为TRUE,则使用操作系统本身的内存分配函数为Bucket分配内存,否则使用PHP的内存分配函数。
unsignedcharnApplyCount;//标记当前hashBucket被递归访问的次数(防止多次递归)
zend_boolbApplyProtection;//标记当前hash桶允许不允许多次访问,不允许时,最多只能递归3次
#ifZEND_DEBUG
intinconsistent;
#endif
}HashTable;
count直接获取nNumOfElements大小,所以也是O(1)
补充------------------------------------------------
count() 函数的定义在这里
/*{{{protointcount(mixedvar[,intmode])
(usuallyanarray)*/
PHP_FUNCTION(count)
{
zval*array;
zend_longmode=COUNT_NORMAL;
zend_longcnt;
zval*element;
ZEND_PARSE_PARAMETERS_START(1,2)
Z_PARAM_ZVAL(array)
Z_PARAM_OPTIONAL
Z_PARAM_LONG(mode)
ZEND_PARSE_PARAMETERS_END();
switch(Z_TYPE_P(array)){
caseIS_NULL:
php_error_docref(NULL,E_WARNING,"");
RETURN_LONG(0);
break;
caseIS_ARRAY:
if(mode!=COUNT_RECURSIVE){
//类型为数组时调用zend内核函数zend_array_count()
cnt=zend_array_count(Z_ARRVAL_P(array));
}else{
cnt=php_count_recursive(Z_ARRVAL_P(array));
}
RETURN_LONG(cnt);
break;
caseIS_OBJECT:{
zvalretval;
/*first,wecheckifthehandlerisdefined*/
if(Z_OBJ_HT_P(array)->count_elements){
RETVAL_LONG(1);
if(SUCCESS==Z_OBJ_HT(*array)->count_elements(array,&Z_LVAL_P(return_value))){
return;
}
}
/*()method*/
if(instanceof_function(Z_OBJCE_P(array),zend_ce_countable)){
zend_call_method_with_0_params(array,NULL,NULL,"count",&retval);
if(Z_TYPE(retval)!=IS_UNDEF){
RETVAL_LONG(zval_get_long(&retval));
zval_ptr_dtor(&retval);
}
return;
}
/*IfThere'snohandleranditdoesn'*/
php_error_docref(NULL,E_WARNING,"");
RETURN_LONG(1);
break;
}
default:
php_error_docref(NULL,E_WARNING,"");
RETURN_LONG(1);
break;
}
}
如果没有特别指定mode参数为 COUNT_RECURSIVE 的话(即作遍历),跳转到 zend 的数组计数函数 zend_array_count()
#definezend_hash_num_elements(ht)
(ht)->nNumOfElements
...
...
staticuint32_tzend_array_recalc_elements(HashTable*ht)
{
zval*val;
uint32_tnum=ht->nNumOfElements;
ZEND_HASH_FOREACH_VAL(ht,val){
if(Z_TYPE_P(val)==IS_INDIRECT){
if(UNEXPECTED(Z_TYPE_P(Z_INDIRECT_P(val))==IS_UNDEF)){
num--;
}
}
}ZEND_HASH_FOREACH_END();
returnnum;
}
ZEND_APIuint32_tzend_array_count(HashTable*ht)
{
uint32_tnum;
if(UNEXPECTED(ht->u.v.flags&HASH_FLAG_HAS_EMPTY_IND)){
num=zend_array_recalc_elements(ht);
if(UNEXPECTED(ht->nNumOfElements==num)){
ht->u.v.flags&=~HASH_FLAG_HAS_EMPTY_IND;
}
}elseif(UNEXPECTED(ht==&EG(symbol_table))){
num=zend_array_recalc_elements(ht);
}else{
num=zend_hash_num_elements(ht);
}
returnnum;
}
IS_REFERENCE:间接 zval 指的就是其真正的值是存储在其他地方的。注意这个IS_REFERENCE类型是不同的,间接 zval 是直接指向另外一个 zval 而不是像zend_reference结构体一样嵌入 zval。
只有当数组中有HASH_FLAG_HAS_EMPTY_IND 这个 flag 时(间接zval)才会对数组进行遍历校验,其他情况下都是直接取 数组(hash table) 里面的 nNumOfElements 的值,答案显而易见了,就是O(1)
2. PHP文件在不同的PHP搭建的环境中运行速度相同吗比如:战神PHP与phpStudy
要比较PHP环境对速度的影响,要同样的服务器硬件配置、同样的操作系统,否则比较就不科学。在大环境相同的情况下,PHP环境的执行速度与两个东西有关:
一是PHP的内核发布版本,这又有两层含义,一方面是PHP3、PHP4、PHP5、PHP6这样的内核版本不同,速度是不同的,一般情况下高版本有较大的优化,但是并不是说高版本就比低版本的速度块,因为高版本增加的功能可能大大增加系统的复杂度,早期的PHP3速度就非常快。二是是否线程安全、是否带调试信息等发型版本的区别,也会影响效率。
二是PHP的扩展配置与运行模式,例如CGI模式、FAST-CGI模式、APACHE/IIS模块模式等,模式不同效率也区别很大。加载的扩展不同对速度也有影响,特别是CGI方式下,加载的扩展越多速度就越慢。
如果以上两个方面都基本一致,那么效率的差异可以不用考虑。另外,一般生产环境不建议使用集成环境,自己配置是最好的。
3. 急求md5破解c78e448cf999a1dd
MD5是消息摘要算法,被广泛使用的密码散列函数,可以产生出一个128位的散列值。由于是消息摘要,我么只有利用暴力破解的方式才可以得到MD5加密前的字符串,本文主要介绍一个免费的MD5解密网站,可以加密MD5,解密MD5,还能解密SHA-1散列值,并支持批量操作,功能非常强大。
工具材料:
能上网的手机或电脑
MD5解密
01
打开http://www.zmd5.cf/
02
在输入框内输入要解密的MD5/SHA-1,然后单击蓝色按钮,马上就会有结果出现。
MD5加密
01
和解密的方法一样,打开http://www.zmd5.cf/encrypt.php
02
输入要加密的内容,点击按钮,就会在下方的表格上分别出现16位的MD5加密,32位的MD5加密,SHA-1加密的结果了。
01
网站的功能不只是进行MD5或SHA-1的加密解密,还有批量加解密等功能,(下面有图)由于功能多,就不一一介绍了,大家有MD5/SHA-1加密或解密这方面需要的话,可以去看看。
md5的加密也很简单。
网上也有很多在线的破解。既然是不可逆转的,那么网上的那些破解是怎么来的呢?
原因很简单,就是使用穷举法来进行破解。
如:我们计算出键盘上所有字符的组合的md5,将加密前后的字符串分别存入数据库中;
然后拿你的md5加密后的字符串进行查询得出加密前的字符串。这就是在线破解的奥秘。
但是这种破解方法也有局限性。如:我对单一一个字符串进行多次的md5加密,那么我们破解就要反复的进行穷举。
如果你不知道字符串被md5加密了多少次,那么就要反复的多试几次了。当然一般的网站使用的md5加密的密码不会太复杂。
相信大家都遇到过这样一个问题:某客户网站后台密码丢失,请我们协助破解。网站的数据库为mysql,网站密码的加密方式为MD5。
处理此类问题的方法不外乎两种:
1、通过MD5破解工具直接破解,比如MD5在线破解:http://www.cmd5.com/
2、还原mysql备份。
先说第一种。虽然现在MD5已经不算真正意义上密码了,但对于复杂度较高的原文,比如l[ZMiAf(对应的密文是),通过工具还是很难被破解出来的。至于第二种方法,如果客户忘记密码是什么时候被修改的,那我们应该还原哪天的备份呢?
其实还有一个简单的办法——修改密码。
虽然我们无法得知现在的密码是什么,但我们可以直接修改密码表里记录的密文。
首先猜解网站密码存放在哪张表里(这不难吧?),然后执行如下命令:
update netsys_manage set NetsysPass=MD5('123');
这样一来,就把网站后台的密码重置为123了。
注:netsys_manage为密码表,NetsysPass为密文字段
4. PHP 正则匹配 效率,原理,是不是一个字符一个字符的处理
建议你不用深究这个,对php这个级别的语言来说想这个没意义。研究c级别的才考虑这个问题。
不过可以肯定的告诉你必然一个字符一个字符处理的,而且不限于。这是和表达式的复杂度有关的。
正则已经是php字符串处理效率最高的方式了,其它更慢。至少手册是这样说的。
其实你自己想想如果让你在一段文字中寻找符合某个条件的内容你是如何查找的,那么其实计算机也是差不多的过程。
5. 什么是PHP
PHP是超文本预处理器,是一种通用开源脚本语言。
PHP独特的语法混合了C、java、Perl以及 PHP 自创的语法。利于学习,使用广泛,主要适用于Web开发领域。
优点:
1、流行,容易上手
PHP是目前最流行的编程语言,这毋庸置疑。它驱动全球超过2亿多个网站,有全球超过81.7%的公共网站在服务器端采用PHP。PHP常用的数据结构都内置了,使用起来方便简单,也一点都不复杂,表达能力相当灵活。
2、开发职位很多
在服务器端的网站编程中PHP会更容易帮助你找到工作。很多互联网相关企业都在使用PHP开发框架,所以可以说市场对PHP的开发程序员的需求还是比较大的。
3、仍然在不断发展
PHP在不断兼容着类似closures和命名空间等技术,同时兼顾性能和当下流行的框架。版本是7之后,一直在提供更高性能的应用。
4、可植入性强
PHP 语言在补丁漏洞升级过程中,核心部分植入简单易行,且速度快。
5、拓展性强
PHP 语言在数据库应用过程中,可以从数据库调取各类数据,执行效率高。
(5)php密码复杂度扩展阅读:
缺点
1、PHP的解释运行机制
在 PHP 中,所有的变量都是页面级的,无论是全局变量, 还是类的静态成员,都会在页面执行完毕后被清空。
2、设计缺陷
缺少关注PHP被称作是不透明的语言,因为没有堆栈追踪,各种脆弱的输入。没有一个明确的设计哲学。早期的PHP受到Perl的影响,带有out参数的标准库又是有C语言引入,面向对象的部分又是从C++和Java学来的。
3、对递归的不良支持
PHP并不擅长递归。它能容忍的递归函数的数量限制和其他语言比起来明显少。
6. php 注册时输入密码后,判断密码的复杂性,怎么做
直接用javascript咯,
唉,有空
讲下思路吧
先在用户密码输入框,用onchange事件或onblur事件监听着这个框,如果触发事件。就执行你的JS检测代码。
用getElementBy("yourTagId") 取得用户密码的值
再用length这个方法去取得这个值的长度。。
用if判断,然后用html函数输出相应的红点到页面。
7. PHP判断密码复杂度
位数用strlen()
非数字检测用preg_match()正则表达式
8. php超实用正则表达式有哪些
php几个超实用正则表达式
1.验证域名检验一个字符串是否是个有效域名
2.从一个字符串中 突出某个单词
3.从HTML文档中获得全部图片
4.删除重复字母
5.删除重复的标点
6.匹配一个XML或者HTML标签
7.匹配具有属性值的XML或者HTML标签
8.匹配十六进制颜色值
9.查找页面 title
10.解释 Apache 日志
11.使用智能引号代替双引号
12.检验密码的复杂度
13.WordPress: 使用正则获得帖子上的图片
14.自动生成笑脸图案
15. 移除图片的链接
9. php几种排序算法实例详解
下面给你介绍四种排序方法:
1) 插入排序(Insertion Sort)的基本思想是:
每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。实现代码如下: