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生成静态页面详解
Dec 05 PHP
php mssql 时间格式问题
Jan 13 PHP
PHP strtotime函数详解
Dec 18 PHP
发一个php简单的伪原创程序,配合商城采集用的
Oct 12 PHP
PHP验证码类代码( 最新修改,完全定制化! )
Dec 02 PHP
php长字符串定义方法
Jul 12 PHP
php中explode与split的区别介绍
Oct 03 PHP
Laravel 5框架学习之数据库迁移(Migrations)
Apr 08 PHP
PHP如何通过AJAX方式实现登录功能
Nov 23 PHP
php自动载入类用法实例分析
Jun 24 PHP
php自定义时间转换函数示例
Dec 07 PHP
Yii2框架实现登录、退出及自动登录功能的方法详解
Oct 24 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
用Socket发送电子邮件
2006/10/09 PHP
php空间不支持socket但支持curl时recaptcha的用法
2011/11/07 PHP
php使用Jpgraph创建折线图效果示例
2017/02/15 PHP
javascript 面向对象编程基础 多态
2009/08/21 Javascript
一个用javascript写的select支持上下键、首字母筛选以及回车取值的功能
2009/09/09 Javascript
为超链接加上disabled后的故事
2010/12/10 Javascript
window.open关于浏览器拦截问题分析及解决方法
2013/02/05 Javascript
浮动的div自适应居中显示的js代码
2013/12/23 Javascript
Js实现网页键盘控制翻页的方法
2014/10/30 Javascript
node.js中的events.EventEmitter.listenerCount方法使用说明
2014/12/08 Javascript
使用JavaScript脚本无法直接改变Asp.net中Checkbox控件的Enable属性的解决方法
2015/09/16 Javascript
基于Echarts 3.19 制作常用的图形(非静态)
2016/05/19 Javascript
浅析JSONP技术原理及实现
2016/06/08 Javascript
EasyUI创建对话框的两种方式
2016/08/23 Javascript
JavaScript编写的网页小游戏,很给力
2017/08/18 Javascript
深入浅析Vue全局组件与局部组件的区别
2018/06/15 Javascript
Element-ui之ElScrollBar组件滚动条的使用方法
2018/09/14 Javascript
Vue项目引发的「过滤器」使用教程
2019/03/12 Javascript
详解Vue 匿名、具名和作用域插槽的使用方法
2019/04/22 Javascript
前端js中的事件循环eventloop机制详解
2019/05/15 Javascript
JavaScript JSON使用原理及注意事项
2020/07/30 Javascript
原生JavaScript实现刮刮乐
2020/09/29 Javascript
python list是否包含另一个list所有元素的实例
2018/05/04 Python
对python中for、if、while的区别与比较方法
2018/06/25 Python
Python 使用 PyMysql、DBUtils 创建连接池提升性能
2019/08/14 Python
python torch.utils.data.DataLoader使用方法
2020/04/02 Python
Django中F函数的使用示例代码详解
2020/07/06 Python
实例教程 一款纯css3实现的数字统计游戏
2014/11/10 HTML / CSS
html5教程调用绘图api画简单的圆形代码分享
2013/12/04 HTML / CSS
使用Html5中的cavas画一面国旗
2019/09/25 HTML / CSS
魅力惠奢品线上平台:MEI.COM
2016/11/29 全球购物
Petmate品牌官方网站:宠物用品
2018/11/25 全球购物
单位工作证明范文
2014/09/14 职场文书
学前班学生评语
2014/12/29 职场文书
《多彩的民间艺术》教学反思
2016/02/16 职场文书
基于PyQt5制作一个群发邮件工具
2022/04/08 Python