php生成固定长度纯数字编码的方法
本文实例讲述了php生成固定长度纯数字编码的方法。分享给大家供大家参考。具体如下:
很多时候我们需要一些固定长度的数字编码,如订单编号、卡号、用户编号等等!但是经常我们有的是存储在数据库中的有序编号,我们可以通过它直接转成一个固定长度的数字编码,然后更新到数据库中形成此记录的唯一编号。
<?php /** *根据日期或者是给定前缀生成唯一编号 *User:minyifei.cn *Date:15/7/7 */ namespaceMinyifei\Libs; classSequenceNumber{ /** *根据显示宽度获取指定的mapbit * *@paraminteger$width编号显示宽度 * *@returnarray */ privatestaticfunction_getMapbit($width) { $mapBits=array( 4=>array( 10,2,11,3,0,1,9,7,12,6,4,8,5, ), 5=>array( 4,3,13,15,7,8,6,2,1,10,5,12,0,11,14,9, ), 6=>array( 2,7,10,9,16,3,6,8,0,4,1,12,11,13,18,5,15,17,14, ), 7=>array( 18,0,2,22,8,3,1,14,17,12,4,19,11,9,13,5,6,15,10,16,20,7,21, ), 8=>array( 11,8,4,0,16,14,22,7,3,5,13,18,24,25,23,10,1,12,6,21,17,2,15,9,19,20, ), 9=>array( 24,23,27,3,9,16,25,13,28,12,0,4,10,18,11,2,17,1,21,26,5,15,7,20,22,14,19,6,8, ), 10=>array( 32,3,1,28,21,18,30,7,12,22,20,13,16,15,6,17,9,25,11,8,4,27,14,31,5,23,24,29,0,10,19,26,2, ), 11=>array( 9,13,2,29,11,32,14,33,24,8,27,4,22,20,5,0,21,25,17,28,34,6,23,26,30,3,7,19,16,15,12,31,1,35,10,18, ), 12=>array( 31,4,16,33,35,29,17,37,12,28,32,22,7,10,14,26,0,9,8,3,20,2,13,5,36,27,23,15,19,34,38,11,24,25,30,21,18,6,1, ), ); return$mapBits[intval($width)]; } /** *格式化给定时间戳 * *@paraminteger$tstimestamp,ifnullusecurrenttimestamp * *@returnstring */ privatestaticfunction_fmtTS($ts=null) { $ts=$ts?:time(); returndate(self::$_fmt,$ts); } /** *根据id获取一个随机唯一编码 *@param$id编号 *@paramint$prefix前缀 *@paramint$width除前缀外长度 *@returnstring */ publicstaticfunctiongenerateNumber($id,$prefix=10,$width=8) { returnsprintf("%s%s",$prefix,self::encode($id,$width)); } /** *编码转换 * *@paraminteger$idid *@paraminteger$width编号额外组成部分的显示宽度 * *@returninteger */ publicstaticfunctionencode($id,$width) { $maximum=intval(str_repeat(9,$width)); $superscript=intval(log($maximum)/log(2)); $r=0; $sign=0x1<<$superscript; $id|=$sign; $mapbit=self::_getMapbit($width); for($x=0;$x<$superscript;$x++){ $v=($id>>$x)&0x1; $r|=($v<<$mapbit[$x]); } $r+=$maximum-pow(2,$superscript)+1; returnsprintf("%0${width}s",$r); } /** *获取唯一编号 * *@paraminteger$idid,mostlydatabaseprimarykey *@paraminteger$width编号显示宽度 *@paraminteger$tstimestamp * *@returnstring */ publicstaticfunctionget($id,$width,$ts=null) { returnsprintf('%s%s',self::_fmtTS($ts),self::encode($id,$width)); } }
希望本文所述对大家的php程序设计有所帮助。