盗賊の極意

Feed Rss

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

06.17.2014, 未分类, by , 3,085 views.

/* 

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

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>