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下实现一个阿拉伯数字转中文数字的函数
Jul 10 PHP
php 学习资料零碎东西
Dec 04 PHP
php操作SVN版本服务器类代码
Nov 27 PHP
PHP图片处理类 phpThumb参数用法介绍
Mar 11 PHP
深入HTTP响应状态码速查表的详解
Jun 07 PHP
PHP实现格式化文件数据大小显示的方法
Jan 03 PHP
利用“多说”制作留言板、评论系统
Jul 14 PHP
PHP魔术方法使用方法汇总
Feb 14 PHP
php车辆违章查询数据示例
Oct 14 PHP
PHP SFTP实现上传下载功能
Jul 26 PHP
PHP实现用户异地登录提醒功能的方法【基于thinkPHP框架】
Mar 15 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
Feb 29 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
在Windows下编译适用于PHP 5.2.12及5.2.13的eAccelerator.dll(附下载)
2010/05/04 PHP
PHP编写RESTful接口的方法
2016/02/21 PHP
php 数组随机取值的简单实例
2016/05/23 PHP
php 使用expat方式解析xml文件操作示例
2019/11/26 PHP
JavaScript中的Screen屏幕对象
2008/01/16 Javascript
javascript 硬盘序列号+其它硬件信息
2008/12/23 Javascript
JQuery EasyUI 对话框的使用方法
2010/10/24 Javascript
jquery乱码与contentType属性设置问题解决方案
2013/01/07 Javascript
基于Jquery代码实现手风琴菜单
2015/11/19 Javascript
hovertree插件实现二级树形菜单(简单实用)
2016/12/28 Javascript
Bootstrap面板学习使用
2017/02/09 Javascript
JS实现向iframe中表单传值的方法
2017/03/24 Javascript
jQuery实现节点的追加、替换、删除、复制功能示例
2017/07/11 jQuery
angularjs 缓存的使用详解
2018/03/19 Javascript
vue基础之模板和过滤器用法实例分析
2019/03/12 Javascript
JS实现网页端猜数字小游戏
2020/03/06 Javascript
JS 设计模式之:工厂模式定义与实现方法浅析
2020/05/06 Javascript
vue实现防抖的实例代码
2021/01/11 Vue.js
《Python之禅》中对于Python编程过程中的一些建议
2015/04/03 Python
tensorflow识别自己手写数字
2018/03/14 Python
python3.6的venv模块使用详解
2018/08/01 Python
pandas 快速处理 date_time 日期格式方法
2018/11/12 Python
详解android与HTML混合开发总结
2018/06/06 HTML / CSS
国际象棋商店:The Chess Store
2018/07/09 全球购物
会计专业推荐信
2013/10/29 职场文书
通信工程毕业生自荐信
2013/11/01 职场文书
工程管理英文求职信
2014/03/18 职场文书
慈善晚会策划方案
2014/05/14 职场文书
新疆民族团结演讲稿
2014/08/27 职场文书
2014年护理部工作总结
2014/11/14 职场文书
小学运动会入场词
2015/07/18 职场文书
爱国主义主题班会
2015/08/14 职场文书
三下乡活动心得体会
2016/01/23 职场文书
Python requests库参数提交的注意事项总结
2021/03/29 Python
AJAX学习笔记
2021/05/18 Javascript
英国数字版游戏销量周榜公布 《小缇娜的奇幻之地》登顶
2022/04/03 其他游戏