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安装攻略:常见问题解答(二)
Oct 09 PHP
刚才在简化php的库,结果发现很多东西
Dec 31 PHP
php 全文搜索和替换的实现代码
Jul 29 PHP
PHP实现时间轴函数代码
Oct 08 PHP
php生成唯一数字id的方法汇总
Nov 18 PHP
PHP Echo字符串的连接格式
Mar 07 PHP
PHP5.4起内置web服务器使用方法
Aug 09 PHP
Laravel中如何增加自定义全局函数详解
May 09 PHP
PHP PDOStatement::debugDumpParams讲解
Jan 30 PHP
PHP实现的敏感词过滤方法示例
Mar 06 PHP
thinkPHP框架通过Redis实现增删改查操作的方法详解
May 13 PHP
laravel5表单唯一验证的实例代码
Sep 30 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
PHP遍历某个目录下的所有文件和子文件夹的实现代码
2013/06/28 PHP
PHP数据库操作之基于Mysqli的数据库操作类库
2014/04/19 PHP
destoon二次开发模板及调用语法汇总
2014/06/21 PHP
ThinkPHP查询中的魔术方法简述
2014/06/25 PHP
PHP获取当前日期和时间及格式化方法参数
2015/05/11 PHP
ThinkPHP使用Ueditor的方法详解
2016/05/20 PHP
Nigma vs Liquid BO3 第二场2.13
2021/03/10 DOTA
在JavaScript中遭遇级联表达式陷阱
2007/03/08 Javascript
DIV+CSS+JS不间断横向滚动实现代码
2013/03/19 Javascript
JS函数定义方式的区别介绍
2016/03/22 Javascript
JavaScript组合模式学习要点
2016/08/26 Javascript
js原生跨域_用script标签的简单实现
2016/09/24 Javascript
Angular1.x复杂指令实例详解
2017/03/01 Javascript
微信小程序--onShareAppMessage分享参数用处(页面分享)
2017/04/18 Javascript
前端主流框架vue学习笔记第一篇
2017/07/26 Javascript
vue 中动态绑定class 和 style的方法代码详解
2018/06/01 Javascript
详解钉钉小程序组件之自定义模态框(弹窗封装实现)
2020/03/07 Javascript
Vue中通过属性绑定为元素绑定style行内样式的实例代码
2020/04/30 Javascript
python的正则表达式re模块的常用方法
2013/03/09 Python
python决策树之C4.5算法详解
2017/12/20 Python
Python人脸识别初探
2017/12/21 Python
Python实现的查询mysql数据库并通过邮件发送信息功能
2018/05/17 Python
MNIST数据集转化为二维图片的实现示例
2020/01/10 Python
python字符串判断密码强弱
2020/03/18 Python
Python中无限循环需要什么条件
2020/05/27 Python
LightInTheBox法国站:中国跨境电商
2020/03/05 全球购物
温泉秘密:Onsen Secret
2020/07/06 全球购物
劳资专员岗位职责
2013/12/27 职场文书
集团公司人力资源部岗位职责
2014/01/03 职场文书
旷课检讨书1000字
2014/02/14 职场文书
项目经理任命书内容
2014/06/06 职场文书
2015年乡镇残联工作总结
2015/05/13 职场文书
2015年大学生暑期实习报告
2015/07/13 职场文书
2016年幼儿园庆六一开幕词
2016/03/04 职场文书
2019年学校消防安全责任书(2篇)
2019/10/09 职场文书
JS继承最简单的理解方式
2021/03/31 Javascript