一个混淆数字userid的简单方法

/* 

一个混淆数字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那样一眼被人识破然后被轻易解读。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注