很多時候, 在網頁鏈結中都會顯示顯示順序的id號碼. (如:
對於面向大眾的頁面是沒有問題的. 有時會遇到下述情況:
由順序的id, 生成無規律的固定長度的字元. 支援正向加密及反向解密. 理論上只能自己解密.
class
fuzzid
//計算最後的數值塊
//*根據最後數值塊的二進位制數轉換為十進位制數
$last_block_dec
=base_convert
($blocks_num
[count
($blocks_num)-
1],2
,10);
//取轉換後的十進位制數
$blocks_out
=$last_block_dec
;//將轉換後的十進位制數,存放於$blocks_out
//計算其他的數值塊
//*根據該塊的二進位制數,作為'原始值'
//*根據最後數值塊的十進位制數,並加上自身所在位置的值,取set_secures該位置字元對應的十進位制數,轉換為固定四位的二進位制數,作為'轉換值'
//*向左對齊'原始值'及'轉換值'後,進行一一校對;如'轉換值'為1時,則'原始值'相應的0轉換為1或1轉換為0
//*轉換後的'原始值'的二進位制數,轉換為十進位制數,存放於$blocks_out
$index_plus
=$last_block_dec
;//自身所在位置的值
for($i=
count
($blocks_num)-
2;$i>=0;
$i--)}
$blocks_out
=base_convert
($block_original,2
,10);
//將轉換後的十進位制數至輸出碼,存放於$blocks_out
$index_plus++;
//增加下個塊自身所在位置的值
}//計算驗證區
//*根據驗證碼的十進位制數及所有數值塊的十進位制數及最後數值塊的十進位制數的和,除以32求余為0,以得出該驗證碼
$valid_dec=32
-((array_sum
($blocks_out)+
(int)
$last_block_dec)%
32);//計算輸出結果
//*從左至右從大到小排序數值區的陣列
//*迴圈根據每個塊的十進位制數,將set_codes該位置的字元返回
$blocks_out
=array_reverse
($blocks_out);
//按順序排列
$final_code=''
;//最終輸出碼
$num_index=0
;//數值區標記
for($i=
0;$i<
$this
->
set_length;$i
++)else
$final_code.=
$this
->
getcodebyindex
($blocks_out
[$num_index])
;//數值區的輸出
$num_index++;
//增加數值區的標記
}//返回結果
return
$final_code;}
/** * 將加密的字串解密
* @param string $str 需解密的字串
* @return false|string 經解密的id值 (異常: false=輸入的字串有問題)
*/public
function
decode
($str
)//計算最後的數值塊
$last_block_dec
=$blocks_num
[count
($blocks_num)-
1];//取最後塊的十進位制數
$last_block_bin
=base_convert
($last_block_dec,10
,2);
//取轉換後的二進位制數
$blocks_out
=$this
->
fillzero
($last_block_bin,5
);//將最後塊固定五位二進位制數,存放於$blocks_out
//判斷校驗區
//*根據驗證碼的十進位制數及所有數值塊的十進位制數及最後數值塊的十進位制數的和,除以32求余為0.
$result=(
array_sum
($blocks_all)+
(int)
$last_block_dec)%
32;if(
0!==
$result
)return
false
;//[錯誤]校驗碼出錯
//計算其他的數值塊
//*根據該塊的十進位制數轉化為二進位制數並補零至五位,作為'結果值'
//*根據最後塊數值的十進位制數,並加上自身所在位置的值,取set_secures該位置字元對應的十進位制數,轉換為固定四位的二進位制數,作為'轉換值'
//*向左對齊'原始值'及'轉換值'後,進行一一校對;如'轉換值'為1時,則'原始值'相應的0轉換為1或1轉換為0
//*轉換後的'原始值'的二進位制數,存放於$blocks_out
$index_plus
=$last_block_dec
;//自身所在位置的值
for($i=
count
($blocks_num)-
2;$i>=0;
$i--)}
$blocks_out
=$block_result
;//將轉換後的二進位制數,存放於$blocks_out
$index_plus++;
//增加下個塊自身所在位置的值
}//獲取id值
$blocks_out
=array_reverse
($blocks_out);
//按順序排列
$out_bins=''
;//最終輸出的id值二進位制數
foreach
($blocks_out
as$dec
)$out_bins.=
$dec
;//迴圈獲取每塊的二進位制數
return
base_convert
($out_bins,2
,10);
//返回相應十進位制數id值
}/**
* 字元或數字前補零
* @param string|int $str 需要補零的字元或數字
* @param int $length 返回數字的長度
* @return false|string 返回補零後的數值 (異常: false=輸入的字串長度超出設定的長度)
*/private
function
fillzero
($str
, int $length
)/**
* 獲取當前輸入位置相應顯示碼的字元
* @param int $index 指定$set_codes的位置
* @return string $set_codes指定位置的字元
*/private
function
getcodebyindex
($index
)/**
* 獲取當前輸入位置相應安全碼的字元
* @param int $index 指定$set_secures位置
* @return string $set_secures指定位置的字元
*/private
function
getsecurebyindex
($index
)/**
* 獲取當前輸入的字元於顯示碼的位置
* @param string $char 輸入的字元
* @return false|int $set_codes所在的位置 (異常: false=輸入的字元不存在於顯示碼內)
*/private
function
getindexbycode
($char
)}
上述從需求至實現均僅於數小時內完成(但基本功能可用), 深知仍有很多不足及需要優化的地方. 期望大家指正及提出…
ps: 第一次發帖, 如有任何問題, 再次還望見諒… 如喜歡本文或上述**對您有用, 煩請幫忙點讚以示支援, 十分感謝!!!
Windows自定義訊息ID
wm user 到 0x7fff 是為私有視窗類保留的。你可以將這個範圍認為是在特定的窗體類中有意義的專用訊息。message ranges in windows 0 wm user 1 系統使用的保留訊息.如 wm create 和 wm scroll.wm user 0x7fff 私有視窗類使用...
自定義控制項中易混淆方法
一大波自定義控制項 view.getscrollx 說明 它表示的是當前的螢幕x座標的最小值 移動的距離 向右滑動時移動的距離為正值,向左滑動時移動的距離為負值 它的起始點始終是最開始接觸螢幕滑動的座標點 只要手指沒有離開螢幕的話 它的值即為離開第一頁的最短距離 表示當前滑塊的x座標 view.sc...
Mybatis plus 自定義ID生成器
雪花演算法生成唯一的有序的序列號 public class snowflakeutils if machineid max machine num machineid 0 this datacenterid datacenterid this machineid machineid 產生下乙個id ...