php生成固定长度纯数字编码的方法


Posted in PHP onJuly 09, 2015

本文实例讲述了php生成固定长度纯数字编码的方法。分享给大家供大家参考。具体如下:

很多时候我们需要一些固定长度的数字编码,如订单编号、卡号、用户编号等等!但是经常我们有的是存储在数据库中的有序编号,我们可以通过它直接转成一个固定长度的数字编码,然后更新到数据库中形成此记录的唯一编号。

<?php
/**
 * 根据日期或者是给定前缀生成唯一编号
 * User: minyifei.cn
 * Date: 15/7/7
 */
namespace Minyifei\Libs;
class SequenceNumber {
 /**
  * 根据显示宽度获取指定的 mapbit
  *
  * @param integer $width 编号显示宽度
  *
  * @return array
  */
 private static function _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)];
 }
 /**
  * 格式化给定时间戳
  *
  * @param integer $ts timestamp, if null use current timestamp
  *
  * @return string
  */
 private static function _fmtTS($ts=null)
 {
  $ts = $ts ?: time();
  return date(self::$_fmt, $ts);
 }
 /**
  * 根据id获取一个随机唯一编码
  * @param $id 编号
  * @param int $prefix 前缀
  * @param int $width 除前缀外长度
  * @return string
  */
 public static function generateNumber($id,$prefix=10,$width=8)
 {
  return sprintf("%s%s", $prefix,self::encode($id, $width));
 }
 /**
  * 编码转换
  *
  * @param integer $id id
  * @param integer $width 编号额外组成部分的显示宽度
  *
  * @return integer
  */
 public static function encode($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;
  return sprintf("%0${width}s", $r);
 }
 /**
  * 获取唯一编号
  *
  * @param integer $id id, mostly database primary key
  * @param integer $width 编号显示宽度
  * @param integer $ts timestamp
  *
  * @return string
  */
 public static function get($id, $width, $ts=null)
 {
  return sprintf('%s%s', self::_fmtTS($ts), self::encode($id, $width));
 }
}

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
UTF8编码内的繁简转换的PHP类
Jul 09 PHP
php 代码优化的42条建议 推荐
Sep 25 PHP
php $_SERVER当前完整url的写法
Nov 12 PHP
在smarty中调用php内置函数的方法
Feb 07 PHP
简单的php缓存类分享     php缓存机制
Jan 22 PHP
为百度UE编辑器上传图片添加水印功能
Apr 16 PHP
php开发时容易忘记的一些技术细节
Feb 03 PHP
PHP模拟post提交数据方法汇总
Feb 16 PHP
PHP引用返回用法示例
May 28 PHP
深入讲解PHP的对象注入(Object Injection)
Mar 01 PHP
php生成毫秒时间戳的实例讲解
Sep 22 PHP
总结PHP代码规范、流程规范、git规范
Jun 18 PHP
php随机获取金山词霸每日一句的方法
Jul 09 #PHP
PHP实现的QQ空间g_tk加密算法
Jul 09 #PHP
PHP自毁程序(慎用)
Jul 09 #PHP
PHP模板解析类实例
Jul 09 #PHP
PHP多文件上传实例
Jul 09 #PHP
php判断linux下程序问题实例
Jul 09 #PHP
php实现html标签闭合检测与修复方法
Jul 09 #PHP
You might like
关于session在PHP5的配置文件中的详细设置参数说明
2011/04/20 PHP
PHP 正则表达式之正则处理函数小结(preg_match,preg_match_all,preg_replace,preg_split)
2012/10/05 PHP
使用Smarty 获取当前日期时间和格式化日期时间的方法详解
2013/06/18 PHP
一个PHP的ZIP压缩类分享
2014/05/04 PHP
php根据一个给定范围和步进生成数组的方法
2015/06/19 PHP
举例详解PHP脚本的测试方法
2015/08/05 PHP
PHP获取用户访问IP地址的5种方法
2016/05/16 PHP
javascript学习笔记(八)正则表达式
2014/10/08 Javascript
详解JavaScript中setSeconds()方法的使用
2015/06/11 Javascript
AngularJS实现元素显示和隐藏的几个案例
2015/12/09 Javascript
javascript精确统计网站访问量实例代码
2015/12/19 Javascript
Node.js使用Express创建Web项目详细教程
2017/03/31 Javascript
React-Native实现ListView组件之上拉刷新实例(iOS和Android通用)
2017/07/11 Javascript
Vue.js 实现数据展示全部和收起功能
2018/09/05 Javascript
微信JS-SDK updateAppMessageShareData安卓不能自定义分享详解
2019/03/29 Javascript
NodeJs之word文件生成与解析的实现代码
2019/04/01 NodeJs
在vue中实现禁止回退上一步,路由不存历史记录
2020/07/22 Javascript
Vue实现开关按钮拖拽效果
2020/09/22 Javascript
在Python中使用SQLite的简单教程
2015/04/29 Python
Selenium chrome配置代理Python版的方法
2018/11/29 Python
利用python实现汉字转拼音的2种方法
2019/08/12 Python
python2 对excel表格操作完整示例
2020/02/23 Python
Python内置方法和属性应用:反射和单例(推荐)
2020/06/19 Python
canvas如何绘制钟表的方法
2017/12/13 HTML / CSS
巴西最大的家具及装饰用品店:Mobly
2017/10/11 全球购物
英国品牌男装折扣网站:Brown Bag
2018/03/08 全球购物
Charles & Colvard官网:美国莫桑石品牌
2019/06/05 全球购物
代码中finally中的代码会不会执行
2012/02/06 面试题
农业资源与环境专业自荐信范文
2013/12/30 职场文书
生日寿宴答谢词
2014/01/19 职场文书
出国留学计划书
2014/04/27 职场文书
开展批评与自我批评发言材料
2014/10/17 职场文书
个人工作年终总结
2015/03/09 职场文书
捐书活动倡议书
2015/04/27 职场文书
《我和小伙伴》教学反思
2016/02/20 职场文书
开发一个封装iframe的vue组件
2021/03/29 Vue.js