文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>分享一个使用php编写的超进位加密算法...

分享一个使用php编写的超进位加密算法...

时间:2010-08-09  来源:ddboy

可能大家写程序时曾经遇到一个问题,就是文档或会员的id不想让用户看到,需要使用一个算法进行加密,或者说像微博那样的短网址生成,用我构想的这种超进位算法完全可以达到这种目的,考虑到英文字母和数字加起来一共是62个,这里默认用62进位,62进位是什么意思呢?简单的说就是把十进制整数类型转化为62进制,使用这种方式,可以把整数压缩为如下长度:

1 - 61
2 - 3843
3 - 238327
4 - 14776335
5 - 916132831
6 - 56800235583

实际应用中,我们可以从3位超进制数开始使用,那么创建数据库时对自动递增id就从238327开始。

这个算法可以通过变换62进制数的位数数字标识或变换位数达到简单的加密效果

具体如下:

<?php /** * 任意位进制转换算法(默认62位,纯字母和数字组合) */ class super2dec { //个位对比数组(第一次用 make_contrast() 生成,以后不可更改) protected static $_super2dec_arr = array('G'=>0,'u'=>1,'z'=>2,'S'=>3,'v'=>4,'l'=>5,'q'=>6,'f'=>7,'5'=>8,'e'=>9, 'j'=>10,'E'=>11,'1'=>12,'d'=>13,'m'=>14,'U'=>15,'P'=>16,'a'=>17,'h'=>18, 'M'=>19,'7'=>20,'y'=>21,'9'=>22,'c'=>23,'B'=>24,'6'=>25,'x'=>26,'t'=>27, 'W'=>28,'I'=>29,'T'=>30,'g'=>31,'k'=>32,'i'=>33,'8'=>34,'D'=>35,'X'=>36, 'r'=>37,'o'=>38,'0'=>39,'n'=>40,'V'=>41,'p'=>42,'@'=>43,'#'=>44,'A'=>45, 'N'=>46,'H'=>47,'Q'=>48,'F'=>49,'4'=>50,'2'=>51,'J'=>52,'b'=>53,'K'=>54, 'R'=>55,'Y'=>56,'O'=>57,'3'=>58,'C'=>59,'L'=>60,'Z'=>61); protected static $_dec2super_arr = array(0=>'G',1=>'u',2=>'z',3=>'S',4=>'v',5=>'l',6=>'q',7=>'f',8=>'5',9=>'e', 10=>'j',11=>'E',12=>'1',13=>'d',14=>'m',15=>'U',16=>'P',17=>'a',18=>'h', 19=>'M',20=>'7',21=>'y',22=>'9',23=>'c',24=>'B',25=>'6',26=>'x',27=>'t', 28=>'W',29=>'I',30=>'T',31=>'g',32=>'k',33=>'i',34=>'8',35=>'D',36=>'X', 37=>'r',38=>'o',39=>'0',40=>'n',41=>'V',42=>'p',43=>'@',44=>'#',45=>'A', 46=>'N',47=>'H',48=>'Q',49=>'F',50=>'4',51=>'2',52=>'J',53=>'b',54=>'K', 55=>'R',56=>'Y',57=>'O',58=>'3',59=>'C',60=>'L',61=>'Z'); //进制数(最大为64) protected static $_digit = 62; //生成对比函数的数组 //如果大于62位,后台会用@#代替某些数字,但小于或等于62位则为纯英文和数字混合 public static function make_contrast() { $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; //52位及以下,只使用字母,53-62位使用字母和数字混合 if( self::$_digit > 52 ) { $chars .= '0123456789'; } //64位需增加@#来补特定数字 if( self::$_digit > 62 ) { $chars .= '@#'; } $super2dec_arr = '$_super2dec_arr = array('; $dec2super_arr = '$_dec2super_arr = array('; for($i=0; $i < self::$_digit; $i++) { $c = $chars[mt_rand(1, strlen($chars))-1]; $chars = str_replace($c, '', $chars); $super2dec_arr .= "'{$c}'=>{$i},"; $dec2super_arr .= "{$i}=>'{$c}',"; } $super2dec_arr .= ');'; $dec2super_arr .= ');'; return $super2dec_arr."\n".$dec2super_arr; } //超进位数和十进位数的个位对照数 private static function _super2dec_base($number) { return self::$_super2dec_arr[$number]; } //十进位数和超进位数的个位对照数 private static function _dec2super_base($number) { return self::$_dec2super_arr[$number]; } //超进位数转换为十进位数 public static function get_dec($number) { $renum = 0; $nlength = strlen($number) - 1; $j = 0; for($i = $nlength; $i > -1; $i-- ) { if( !isset(self::$_super2dec_arr[$number[$i]]) ) { return false; } $renum += self::_super2dec_base($number[$i]) * pow(self::$_digit, $j); $j++; } return $renum; } //十进位数换为超进位数 public static function get_super($number) { $renum = ''; if( empty($number) ) { return self::_dec2super_base(0); } while(true) { $next_dd = floor( $number / self::$_digit ); $cur_limit = $number % self::$_digit; if( $next_dd==0 ) { if( $cur_limit != 0) { $renum = self::_dec2super_base($cur_limit).$renum; } break; } else { $renum = self::_dec2super_base($cur_limit).$renum; $number = $next_dd; } } return $renum; } } ?>

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载