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 相关文章推荐
PHP strtok()函数的优点分析
Mar 02 PHP
php打造属于自己的MVC框架
Mar 07 PHP
深入PHP数据加密详解
Jun 18 PHP
使用CodeIgniter的类库做图片上传
Jun 12 PHP
smarty简单分页的实现方法
Oct 27 PHP
php使用unset()删除数组中某个单元(键)的方法
Feb 17 PHP
php计算到指定日期还有多少天的方法
Apr 14 PHP
php实现简单的MVC框架实例
Sep 23 PHP
ThinkPHP框架里隐藏index.php
Apr 12 PHP
PHP实现的简单操作SQLite数据库类与用法示例
Jun 19 PHP
php+javascript实现的动态显示服务器运行程序进度条功能示例
Aug 07 PHP
PHP设计模式(观察者模式)
Jul 07 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
mysql 性能的检查和优化方法
2009/06/21 PHP
php获取后台Job管理的实现代码
2011/06/10 PHP
解析如何修改phpmyadmin中的默认登陆超时时间
2013/06/25 PHP
apache中为php 设置虚拟目录
2014/12/17 PHP
Laravel5.1 框架表单验证操作实例详解
2020/01/07 PHP
jQuery文本框(input textare)事件绑定方法教程
2013/04/24 Javascript
javascript检测对象中是否存在某个属性判断方法小结
2013/05/19 Javascript
IE6中链接A的href为javascript协议时不在当前页面跳转
2014/06/05 Javascript
JavaScript中document.forms[0]与getElementByName区别
2015/01/21 Javascript
Bootstrap每天必学之表格
2015/11/23 Javascript
javascript判断图片是否加载完成的方法推荐
2016/05/13 Javascript
使用JavaScript判断手机浏览器是横屏还是竖屏问题
2016/08/02 Javascript
jQuery ztree实现动态树形多选菜单
2016/08/12 Javascript
js数组操作方法总结(必看篇)
2016/11/22 Javascript
ES6使用let命令更简单的实现块级作用域实例分析
2017/03/31 Javascript
微信小程序使用request网络请求操作实例
2017/12/15 Javascript
JS实现运动缓冲效果的封装函数示例
2018/02/18 Javascript
解决vue-cli单页面手机应用input点击手机端虚拟键盘弹出盖住input问题
2018/08/25 Javascript
js实现点击选项置顶动画效果
2020/08/25 Javascript
[38:42]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第二场 11.05
2020/11/05 DOTA
Python素数检测实例分析
2015/06/15 Python
python使用tensorflow保存、加载和使用模型的方法
2018/01/31 Python
Python之文字转图片方法
2018/05/10 Python
如何优雅地改进Django中的模板碎片缓存详解
2018/07/04 Python
python opencv实现旋转矩形框裁减功能
2018/07/25 Python
css3 线性渐变和径向渐变示例附图
2014/04/08 HTML / CSS
美国时尚大码女装购物网站:Avenue
2019/05/24 全球购物
汉米尔顿手表官网:Hamilton
2020/09/13 全球购物
汽车运用工程系毕业生自荐信
2013/12/27 职场文书
法定代表人授权委托书
2014/04/04 职场文书
《火烧云》教学反思
2014/04/12 职场文书
劳动竞赛活动总结
2014/05/05 职场文书
全国优秀教师事迹材料
2014/08/26 职场文书
热血教师观后感
2015/06/10 职场文书
解决Golang time.Parse和time.Format的时区问题
2021/04/29 Golang
SpringRetry重试框架的具体使用
2021/07/25 Java/Android