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)的基本思想是:
每次將一個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子文件中的適當位置,直到全部記錄插入完成為止。實現代碼如下: