本文目錄一覽:
PHP常用加密解密方法
作者/上善若水
1.md5(string $str,bool $flag = false);
$flag = false 默認返回32位的16進至數據散列值
$flag = true 返回原始流數據
2.sha1($string,$flag = false)
$flag = false 默認返回40位的16進至數據散列值
true 返回原始流數據
3.hash(string $algo,srting $str,bool $flag);
$algo : 演算法名稱,可通過hash_algos()函數獲取所有hash加密的演算法
如:md5,sha1等,採用md5,sha1加密所得結果和1,2兩種方式結 果相同。
$flag = false 默認返回16進至的數據散列值,具體長度根據演算法不同
而不同。
true 返回原始流數據。
4.crypt(string $str,$string $salt);
函數返回使用 DES、Blowfish 或 MD5 演算法加密的字元串。
具體演算法依賴於PHP檢查之後支持的演算法和$salt的格式和長度,當 然具體結果也和操作系統有關。比較結果採用 hash_equals($crypted,crypt($input,$salt));//且salt值相同
Password_verify($str,$crypted);
5.password_hash ( string $str, integer $algo [, array $options ] )
函數返回哈希加密後的密碼字元串, password_hash() 是crypt()的 一個簡單封裝
$algo : 演算法 PASSWORD_DEFAULT ,PASSWORD_BCRYPT
$options = [
「cost」=10,//指明演算法遞歸的層數,
「salt」=「xxadasdsad」//加密鹽值,即將被遺 棄,採用系統自動隨機生成安全性更高
];
使用的演算法、cost 和鹽值作為哈希的一部分返回
Password_verify($str,$hashed);
6.base64_encode(string $str)
設計此種編碼是為了使二進位數據可以通過非純 8-bit 的傳輸層 傳輸,例如電子郵件的主體。base64_decode(string $encoded)
可以進行解碼;
7.mcrypt_encrypt ( string $cipher , string $key , string $data ,
string $mode [, string $iv ] )
mcrypt_decrypt ( string $cipher , string $key , string $crypted ,
string $mode [, string $iv ] )
$ciper:加密演算法,mcrypt_list_algorithms()可以獲取該函數所有支持的演算法
如MCRYPT_DES(「des」),MCRYPT_RIJNDAEL_128(「rijndael-128」);
$mode : 加密模式 ,mcrypt_list_modes()獲取所有支持的加密模式,ecb,cbc
$key: 加密的秘鑰,mcrypt_get_key_size ( string $cipher , string $mode )
獲取指定的演算法和模式所需的密鑰長度。$key要滿足這個長度,如果長 度無效會報出警告。
$iv : 加密的初始向量,可通過mcrypt_create_iv ( int $size [, int $source = MCRYPT_DEV_URANDOM ] ),
Iv的參數size:
通過mcrypt_get_iv_size ( string $cipher , string $mode )獲取
Iv 的參數source:
初始向量數據來源。可選值有: MCRYPT_RAND (系統隨機數生成 器), MCRYPT_DEV_RANDOM (從 /dev/random 文件讀取數據) 和 MCRYPT_DEV_URANDOM (從 /dev/urandom 文件讀取數據)。 在 Windows 平台,PHP 5.3.0 之前的版本中,僅支持 MCRYPT_RAND。
請注意,在 PHP 5.6.0 之前的版本中, 此參數的默認值 為 MCRYPT_DEV_RANDOM。
Note: 需要注意的是,如果沒有更多可用的用來產生隨機數據的信息, 那麼 MCRYPT_DEV_RANDOM 可能進入阻塞狀態。
$data : 要加密的字元串數據
最常見的演算法,用PHP如何實現
1、冒泡排序
function bubble_sort($arr) {
$n=count($arr);
for($i=0;$i$n-1;$i ){
for($j=$i 1;$j$n;$j ) {
if($arr[$j]$arr[$i]) {
$temp=$arr[$i];
$arr[$i]=$arr[$j];
$arr[$j]=$temp;
}
}
}
return $arr;
}
2、歸併排序
function Merge($arr, $left, $mid, $right) {
$i = $left;
$j = $mid 1;
$k = 0;
$temp = array();
while ($i = $mid $j = $right)
{
if ($arr[$i] = $arr[$j])
$temp[$k ] = $arr[$i ];
else
$temp[$k ] = $arr[$j ];
}
while ($i = $mid)
$temp[$k ] = $arr[$i ];
while ($j = $right)
$temp[$k ] = $arr[$j ];
for ($i = $left, $j = 0; $i = $right; $i , $j )
$arr[$i] = $temp[$j];
}
function MergeSort($arr, $left, $right)
{
if ($left $right)
{
$mid = floor(($left $right) / 2);
MergeSort($arr, $left, $mid);
MergeSort($arr, $mid 1, $right);
Merge($arr, $left, $mid, $right);
}
}
3、二分查找-遞歸
function bin_search($arr,$low,$high,$value) {
if($low$high)
return false;
else {
$mid=floor(($low $high)/2);
if($value==$arr[$mid])
return $mid;
elseif($value$arr[$mid])
return bin_search($arr,$low,$mid-1,$value);
else
return bin_search($arr,$mid 1,$high,$value);
}
}
4、二分查找-非遞歸
function bin_search($arr,$low,$high,$value) {
while($low=$high) {
$mid=floor(($low $high)/2);
if($value==$arr[$mid])
return $mid;
elseif($value$arr[$mid])
$high=$mid-1;
else
$low=$mid 1;
}
return false;
}
5、快速排序
function quick_sort($arr) {
$n=count($arr);
if($n=1)
return $arr;
$key=$arr[0];
$left_arr=array();
$right_arr=array();
for($i=1;$i$n;$i ) {
if($arr[$i]=$key)
$left_arr[]=$arr[$i];
else
$right_arr[]=$arr[$i];
}
$left_arr=quick_sort($left_arr);
$right_arr=quick_sort($right_arr);
return array_merge($left_arr,array($key),$right_arr);
}
6、選擇排序
function select_sort($arr) {
$n=count($arr);
for($i=0;$i$n;$i ) {
$k=$i;
for($j=$i 1;$j$n;$j ) {
if($arr[$j]$arr[$k])
$k=$j;
}
if($k!=$i) {
$temp=$arr[$i];
$arr[$i]=$arr[$k];
$arr[$k]=$temp;
}
}
return $arr;
}
7、插入排序
function insertSort($arr) {
$n=count($arr);
for($i=1;$i$n;$i ) {
$tmp=$arr[$i];
$j=$i-1;
while($arr[$j]$tmp) {
$arr[$j 1]=$arr[$j];
$arr[$j]=$tmp;
$j–;
if($j0)
break;
}
}
return $arr;
}
php語言字典代碼
求一PHP演算法,字典生成。時間一到再加100分。如:字元:0-9,長度:1,
那就生成0,1,2,3,4,5,6,7,8,9
長度:2,就會生成00-99
現在要求字元可以包括a-z,或者其他特殊符號,求一高效的生成演算法。
參考答案一
function get_string($strlen){
$source=’0123456789′; //任意字元
$len = strlen($source); //長度
$return = array();
for($i = 0 ;$i $len;$i++){
for($j = 0;$j $strlen;$j++){
$return[$i] .= $i;
}
}
return implode(‘,’, $return);
}
如果輸入長度2: 輸出結果就是:
00,11,22,33,44,55,66,77,88,99
參考答案二
優化了進位演算法:
PHP code =0;$no–){ $word=$source{$series[$no]}.$word; $series[$no]+=$tonext_value; if($no0){ if($series[$no]==$len){ $series[$no]=0; $tonext_value=1; }else{ $tonext_value=0; } } } echo “$word “; } } gene_dic(2); ?
簡單的說,我會把這個理解為0-9(十進位)下十個數字生成兩位數字、可重複的排列問題。
排列演算法我自己建立過的就是簡單的N進位下的+1演算法,保證可以遍歷。
即:
初始化到0,
1. +1
2. 是否超過要生成的位數?否,則回到1;
3. 輸出
參考答案三
PHP code =0;$no–){//循環遍曆數組每次從源字串中取一個字元,為便於進位運算,取字元是從後往前取 $word=$source{$series[$no]}.$word;//先取出一個字元 //取出一個字元後就要判斷當前數組元素如何如果改變值,為下一次「大循環」做準備 if($no==$n-1){//末位的判斷,它比較特殊,每次大循環都要增值 if($series[$no]==$len-1){ $series[$no]=0; $tonext_value=1;//歸零時就進位 }else{ $series[$no]+=1; $tonext_value=0;//未歸零就增值,不進位 } }elseif($no$n-1){//中間位的進位判斷 $series[$no]+=$tonext_value;//先取得上一位的進位值 if($series[$no]==$len){ $series[$no]=0; $tonext_value=1;//歸零了就繼續進位 }else{ $tonext_value=0;//不歸零就不進位 } }else{ $series[$no]+=$tonext_value;//大循環次數決定了「老大」是只進不出的。 } } echo “$word “;//輸入單詞 } } gene_dic(2);//測試,結果OK。
參考答案四
PHP code =0;$no–){//循環遍曆數組每次從源字串中取一個字元,為便於進位運算,取字元是從後往前取 $word=$source{$series[$no]}.$word;//先取出一個字元 //取出一個字元後就要判斷當前數組元素如何如果改變值,為下一次「大循環」做準備 if($no==$n-1){//末位的判斷,它比較特殊,每次大循環都要增值 if($series[$no]==$len-1){ $series[$no]=0; $tonext_value=1;//歸零時就進位 }else{ $series[$no]+=1; $tonext_value=0;//未歸零就增值,不進位 } }elseif($no$n-1){//中間位的進位判斷 $series[$no]+=$tonext_value;//先取得上一位的進位值 if($series[$no]==$len){ $series[$no]=0; $tonext_value=1;//歸零了就繼續進位 }else{ $tonext_value=0;//不歸零就不進位 } }else{ $series[$no]+=$tonext_value;//大循環次數決定了「老大」是只進不出的。 } } echo “$word “;//輸入單詞 } } gene_dic(2);//測試,結果OK。
參考答案五
應該是:
function get_string($strlen){
$source=’0123456789′;
$len = strlen($source);
$return = array();
for($i = 0 ;$i $len;$i++){
for($j = 1;$j = $strlen;$j++){
$return[$i] .= substr($source,$i,1);
}
}
return implode(‘,’, $return);
}
【拓展閱讀】如何開始一門語言的學習
一門語言從發明到演進必有原因。
現在還有很多人推薦學習不同的語言。通過比較,了解它的發展史,
創始人的初心等因素都需要留意。多個思考,這個語言在5年,在10年後還是否保持活力?
當有幾個類似的語言被選擇時,我們不妨對它們做一個Swat分析。
列出這些語言的共同點,還有它們之間的規則差異。
了解語言的發展史
開發語言從彙編開始,如最早的計算機ENIAC,使用的就是它來編程。
再到Fortarin,再到C語言,Cobol,Basic。每一個語言都與當時發展的階段有點密切關聯。
人類的每個發明都與懶惰有關,語言也是為便捷性而生。有的語言
C是除彙編外最重視效率的語言,擴展的C++也繼承了此特性。Perl是做文本處理效率最佳的語言,雖然它的發展有點慢。PHP做Web開發,是「世界上最好的.語言」,Python的閱讀性和大數據處理都做得樣樣俱佳。
當了解語言的歷史沿革後,會讓我們對其創始人有很強烈的興趣,成為忠實的腦殘粉,學習該語言的興趣會更濃烈。
人們常常說某個語言比哪個好,這其實沒有必要。不必要為其它人的語言所惑,需要你自己做出選擇。
語言的共通點
這個星球的人都是一個鼻子兩雙只水汪汪的大眼睛,與人們的模樣一般,編程語言也有一個大致相同的長相。
語法:這是開發此語言定義的規則「套路」:
運算符順序,變數常量定義/作用域,表達式定義,字元串定義,行尾結束符等。
流程式控制制:循環控制
這些語法都是成對的,如if,for,while,foreach,有的語言還提供goto這樣類似彙編語言的語法。
函數與方法
一些能夠復用的高質量代碼組合。函數執行後有返回,有遞歸,有嵌套,還有幹完活就完事的簡單任務。有靜態函數和動態函數區分。
容器
數組,哈希表(也叫散列),字典等用來保存數據的容器。
錯誤/例外處理
現代編程語言基本都支持出錯的拋出,除了C語言之外。
比如硬碟不足,網路出錯,黑客攻擊等情形。就像購物中心裡出現煤氣泄露時,監測設備,物聯網設備能夠及時記錄與傳遞給指揮中心。
沒有錯誤拋出的語言,需要自己考慮儘可能出錯的場景並處理,比如:
if(is_overfllow)
//處理
if(network_error)
//處理
可以還有不少需要關注的維度,這會讓代碼變得艱澀難懂,也難以維護。
我們可以用這樣的方式,讓其更簡潔:
on error goto ERROR
ERROR:
..//
但這總是會需要我們照顧很多情形。於是C++推出了一個語法:
try{
//可能會出錯的代碼
//可能會出錯的代碼
}catch{
//處理出錯的邏輯
//處理出錯的邏輯
}finally{
//出不出錯都要執行的代碼
}
最後一句是微軟公司給業界提供貢獻的finally代碼塊。
以上這些成為語言處理異常機制的基礎。
容器
容器是很重要的一節,所以我們單獨再提出來。很多邏輯處理,使用容器保存數據,該語言會提供便捷的方法來提供存取。
比如C、Perl、PHP、Ruby中均提供的數組和關聯數組,LISP提供的列表,Java、Python提供的元組、鏈表等。
雖然名字相同,但是實現方式卻是完全不同,使用方法當然也不一樣。
沒有萬能的容器,只有最合適的。可以從節省內存,節約時間還是編碼效率等綜合考慮。
字元串與字元編碼
是否支持unicode編碼。從摩斯碼到ASCII到統一的Unicode編碼支持。
並發處理
有的語言在設計時並無此方面的考慮,或者天生設計存在缺陷。
即多線程,多進程的概念。包括共享,鎖,事備等特性。
面向對象
支持類,繼承,模塊,包,命名空間,閉包等。有這些特性才會讓人們的工作變得更便利、更有效率。
小結
學習一門語言的關鍵,需要我們在平靜地心緒下,帶著濃厚的興趣去學習,在比較中學習,在歷史中學習。
有時候感覺還是不夠通暢,先做知識的搬運工也是不錯。另外,不斷的實踐會讓我們的信心更足。
常見的php排序演算法
常見的php排序演算法
本文匯總了常見的php排序演算法,在進行演算法設計的時候有不錯的借鑒價值。現分享給大家供參考之用。具體如下:
一、插入排序
用文字簡單的描述,比如說$arr = array(4,2,4,6,3,6,1,7,9); 這樣的一組數字進行順序排序:
那麼,首先,拿數組的第二個元素和第一元素比較,假如第一個元素大於第二元素,那麼就讓兩者位置互換,接下來,拿數組的第三個元素,分別和第二個,第一個元素比較,假如第三個元素小,那麼就互換。依次類推。這就是插入排序,它的時間頻度是:1+2+…+(n-1)=(n^2)/2。則它的時間複雜度為O(n^2).
php實現代碼如下:
?phpfunction Sort($arr){ $count = count($arr); if($count2){ return $arr; } for($i=1;$i$count;$i++){ tmp=”$arr[$i];” j=””=0$arr[$j]$arr[$i]){ return=””
二、選擇排序
選擇排序用語言描述的話,可以這樣,如:$arr = array(4,3,5,2,1);
首先,拿第一個和後面所有的比,找出最小的那個數字,然後和第一個數組互換(當然,如果是第一個最小,那麼就不用互換了),接著循環,即:拿第二個和後面的比較,找出最小的數字,然後和第二個數字互換,依次類推,也就是說每次都是找出剩餘最小的值。 可得到:第一次,時間頻度 是n, (第一個和後面的n-1個比較,找到最小的,再看是不是第一個,不是第一個的話進行互換) 在往後,依次是 減一 。 它的時間複雜度,也是O(n^2);
php實現代碼如下:
?phpfunction selectSort($arr){ $count = count($arr); if($count2){ return $arr; } for($i=0;$i$count;$i++){ $min=$i; for(j=$i+1;$j$count;$j++){$arr[$j]){ $min = $j; //找到最小的那個元素的下標 } } if($min!=$i){//如果下標不是$i 則互換。 $tmp= $arr[$i]; $arr[$i] = $arr[$min]; $arr[$min] = $tmp; } } return $arr; }?
三、冒泡排序
冒泡排序其實上是和選擇排序相比,並無明顯差別。都是找到最小的,放到最左端。依次循環解決問題。差別在於冒泡排序的交換位置的次數較多,而選擇排序則是找到最小的元素的下標,然後直接和最左端的交換位置。
php實現代碼如下:
?phpfunction selectSort($arr){ $count = count($arr); if($count2){ return $arr; } for($i=0;$i$count;$i++){ for(j=$i+1;$j$count;$j++){$arr[$j]){ $tmp= $arr[$i]; $arr[$i] = $arr[$i]; $arr[$i] = $tmp; } } } return $arr; }?
四、快速排序
快速排序,用語言來形容的話,從數組中選擇一個值$a,然後和其餘元素進行比較,比$a大的放到數組right中,反之,放到數組left中。然後將left right 分別進行遞歸調用,即:再細分left right ,最後進行數組的合併。
php實現快速排序:
?phpfunction mySort($arr){ $count = count($arr); if($count2){ return $arr; } $key = $arr[0];//選擇第一個元素作為比較元素,可選其他 $left = array(); $right = array(); for($i=1;$i$count;$i++){ key=””=$arr[$i]){ $left[] = $arr[$i]; }else{ $right[] = $arr[$i]; } } $left = mySort($left); $right = mySort($right); $result = array_merge($left,$right); return $result; }?
五、歸併排序
其實歸併排序是一種拆分,合併的思想。和快速排序思想有共通之處,左邊一堆,右邊一堆,然後進行合併。通過遞歸實現排序。 區別之處呢? 他們的區別也是思想上本質的區別,快速排序的拆分,是選擇了特定的值進行大小比較,從而分為left 和 right 。也就是小的一堆放入left,大的一堆放入right。而後,小的left 再細分為left1 right1。。。。通過進行類似的遞歸完成排序。也就是說,一直細分下去,遞歸最末尾的left1就是最小值。
而歸併排序,是從幾何上的左右切分,一直遞歸切分成2或者1的’最小粒度的數組,然後才開始進行比較大小,然後合併。此處的比較大小是:兒子left的元素 和兒子的right元素 進行比較,而後進行排序合併成為父親left或者right。在此,直到拿到各自排序合併完成最後兩個數組:最起初的left 和right,也僅僅直到他們各自的順序,並不能確認整個數組的順序,還是需要通過最終的left right 比較後合併才能完成真正意義上的排序。
?phpfunction gbSort($arr){ if(count($arr)=1){return min=”floor(count($arr)/2);//取中間數字進行拆分” left=”gbSort($left);” right=”gbSort($right);” return=”” function=””$right[0] ? array_shift($right) : array_shift($left); //進行比較,小的移除,並且放入到數組$m中。 } return arr_merge($m,$left,$right);//進行合併(由於不知道left right 哪個會為空,所以進行統一合併)}?
六、堆排序
本例中fixDown函數實現對某一個節點的向下調整,這裡默認的是起始節點為1,方便計算父子節點關係
注:
起始節點為1的父子關係: 父節點k, 子節點為2K、2k+1 子節點j, 父節點為 floor(j/2) floor為向下取整
起始節點為0的父子關係: 父節點k, 子節點為2K+1, 2k+2 子節點j, 父節點為 floor((j-1)/2)
參數$k為調整點位置, $lenth為數組長度,也就是從1起始到最後一個節點的坐標.
?phpfunction fixDown($arr, $k, $lenth){while(2*$k=$lenth) { //只要當前節點有子節點, 就需要繼續該循環 $j = $k*2; if ($j$lenth $arr[$j]$arr[$j+1]) $j++; // 只要子節點有右節點,且右節點比左節點大,那麼切換到右節點操作。 if ($arr[$j] $arr[$k]) break; // 如果子節點都沒有父節點大, 那麼調整結束。 exch($arr[$j], $arr[$k]); $k = $j; }}function exch($a, $b) { $tmp = $a; $a = $b; $b = $tmp;}function headSort($arr){ $len = count($arr); array_unshift($arr, NULL); for($i=$len/2;$i=1;$i–) { fixDown($arr, $i, $len); } while($len1) { exch($arr[1], $arr[$len]); fixDown($arr, 1, –$len); } array_shift($arr);}$arr = array(4,6,4,9,2,3);headSort($arr);?
希望本文所述排序演算法實例對大家的php程序設計有所幫助。
;
求一個一維數組內部元素的所有可能的組合的演算法?用php實現
原理相當的簡單,就是依次向盤子裡面放abc三種水果,後面一個在前面的一堆方法基礎上再依次的放,放一個盤的時候有3种放法,兩個盤的時候有3*3种放法,三個盤的時候是3*3*3种放法,所以最後總數是3的5次方,也就是有243個組合。下面的代碼就是體現出這種邏輯。
?php
$fruit=array(‘a’,’b’,’c’);
$dishes[]=range(1,5);
for($i=0;$i5;$i++){
foreach($dishes as $k=$v){
foreach($fruit as $_fruit){
$v[$i]=$_fruit;
$dishes[]=$v;
}
unset($dishes[$k]);
}
}
$dishes=array_values($dishes);
foreach($dishes as $k=$v)
echo $k+1,’:’,implode(”,$v),’br’;
?
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/193244.html