Post Views:
7,529
/*
一个混淆数字userid的简单方法
效果是 encode: 1234 => 48915174
decode : 48915174 => 1234
*/
function encodeNumber( $number, $modulo, $prime ){
return ( $number * $prime ) & $modulo; // &操作等价于取模
}
function decodeNumber( $code, $modulo, $primeInverse ){
return ( $code * $primeInverse ) & $modulo; // &操作等价于取模
}
// 例:
// magic number 可以用在线工具事先算出来 http://planetcalc.com/3311/
$modulo = pow( 2, 26 ) – 1;
$prime = 7381371;
$primeInverse = 5555;
$id = 1234;
function show( $number ){
global $modulo, $prime, $primeInverse;
$encoded = encodeNumber( $number, $modulo, $prime );
$decoded = decodeNumber( $encoded, $modulo, $primeInverse );
print_r( [
“id” => $number,
“encoded” => $encoded,
“decoded” => $decoded,
] );
}
show( $id );
—————- 代码文字分隔线 —————-
有兴趣可以在 http://www.compileonline.com/execute_php_online.php 上演练一下,复制粘贴就好。
简单介绍一下。
出处是这里,我是从stackoverflow上看来的。原理是利用模逆元素的特性,blablabla。
模用2的幂减1是为了求模计算的效率。
限制是可以混淆的数字不能大于模,否则编码后的数值会有重复,或者说会从头开始新一轮循环。
另外这毕竟不是加密,用途类似base64吧,不过不会像base64那样一眼被人识破然后被轻易解读。