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 相关文章推荐
require(),include(),require_once()和include_once()的异同
Jan 02 PHP
php中ob(Output Buffer 输出缓冲)函数使用方法
Jul 21 PHP
php下尝试使用GraphicsMagick的缩略图功能
Jan 01 PHP
PHP获取文件后缀名的三个函数
Oct 15 PHP
phpMyAdmin自动登录和取消自动登录的配置方法
May 12 PHP
PHP简单判断字符串是否包含另一个字符串的方法
Mar 25 PHP
php文件上传后端处理小技巧
May 22 PHP
php结合ajax实现手机发红包的案例
Oct 13 PHP
PHP静态成员变量和非静态成员变量详解
Feb 14 PHP
PHP合并数组函数array_merge用法分析
Feb 17 PHP
PHP编程快速实现数组去重的方法详解
Jul 22 PHP
php5对象复制、clone、浅复制与深复制实例详解
Aug 14 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
附件名前加网站名
2008/03/23 PHP
php中将地址生成迅雷快车旋风链接的代码[测试通过]
2011/04/20 PHP
PHP简单读取PDF页数的实现方法
2016/07/21 PHP
“不能执行已释放的Script代码”错误的原因及解决办法
2007/09/09 Javascript
jQuery中filter(),not(),split()使用方法
2010/07/06 Javascript
随窗体滑动的小插件sticky源码
2013/06/21 Javascript
JavaScript实现按照指定长度为数字前面补零输出的方法
2015/03/19 Javascript
javascript实现textarea中tab键的缩排处理方法
2015/06/26 Javascript
基于ajax实现文件上传并显示进度条
2015/08/03 Javascript
JS组件Bootstrap Table使用实例分享
2016/05/30 Javascript
详解jQuery简单的表单应用
2016/12/16 Javascript
js实现的简练高效拖拽功能示例
2016/12/21 Javascript
js控制一个按钮是否可点击(可使用)disabled的实例
2017/02/14 Javascript
如何通过非数字与字符的方式实现PHP WebShell详解
2017/07/02 Javascript
JS验证码实现代码
2017/09/14 Javascript
基于zTree树形菜单的使用实例
2017/12/25 Javascript
vue.js 双层嵌套for遍历的方法详解, 类似php foreach()
2018/09/07 Javascript
layui使用button按钮 点击出现弹层 弹层中加载表单的实例
2019/09/04 Javascript
layer.js open 隐藏滚动条的例子
2019/09/05 Javascript
js判断复选框是否选中的方法示例【基于jQuery】
2019/10/10 jQuery
Vue 实现从文件中获取文本信息的方法详解
2019/10/16 Javascript
[02:27]DOTA2英雄基础教程 莱恩
2014/01/17 DOTA
python多线程操作实例
2014/11/21 Python
深入理解Python中的super()方法
2017/11/20 Python
tensorflow 1.0用CNN进行图像分类
2018/04/15 Python
Python基于递归算法求最小公倍数和最大公约数示例
2018/07/27 Python
python 利用pywifi模块实现连接网络破解wifi密码实时监控网络
2019/09/16 Python
在python中logger setlevel没有生效的解决
2020/02/21 Python
python中前缀运算符 *和 **的用法示例详解
2020/05/28 Python
布鲁明戴尔百货店:Bloomingdale’s
2016/12/21 全球购物
北美领先的智能产品购物网站:Wellbots
2018/06/11 全球购物
美国室内盆栽植物购买网站:Plants.com
2020/04/24 全球购物
女方回门宴答谢词
2014/01/14 职场文书
财务主管岗位职责
2014/02/28 职场文书
任命书怎么写
2014/06/04 职场文书
高三化学教学反思
2016/02/22 职场文书