PHP实现生成唯一编号(36进制的不重复编号)
当我们要将一个庞大的数据进行编号时,而编号有位数限制,比如5位的车牌号、10位的某证件号码、订单流水号、短网址等等,我们可以使用36进制计算出符合位数的不重复的编号。
我们将0-Z(0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ)分别代表数值0-35,如字母Z代表35。这样的话我要得到一个5位的编号,最大信息量就是36的5次方了,36^5 = 60466176,即最大的5位编号相当于10进制的数字:60466176。
本文中为了做演示,我们假定某俱乐部发放一批10位的会员卡号,会员卡号由3位城市编号+5位卡号编码+2位校验码组成。城市编号用区号表示,如755代表深圳,5位卡编号则由36进制的卡编号组成,后面两位校验码则是通过一定的算法生成的,校验码的用处是可以验证卡号的合法性。这样的话,我们生成的10位卡号相当于最大能满足6000多万会员卡号,并且是不重复唯一的卡号。
PHP实现
我们使用PHP进行进制转换,10进制转36进制。
class Code { //密码字典 private $dic = array( =>'', =>'', =>'', =>'', =>'', =>'', =>'', =>'', =>'', =>'', =>'A', =>'B', =>'C', =>'D', =>'E', =>'F', =>'G', =>'H', =>'I',=>'J', =>'K', =>'L', =>'M', =>'N', =>'O', =>'P', =>'Q', =>'R',=>'S', =>'T', =>'U', =>'V', =>'W', =>'X', =>'Y', =>'Z' ); public function encodeID($int, $format=) { $dics = $this->dic; $dnum = ; //进制数 $arr = array (); $loop = true; while ($loop) { $arr[] = $dics[bcmod($int, $dnum)]; $int = bcdiv($int, $dnum, ); if ($int == '') { $loop = false; } } if (count($arr) < $format) $arr = array_pad($arr, $format, $dics[]); return implode('', array_reverse($arr)); } public function decodeID($ids) { $dics = $this->dic; $dnum = ; //进制数 //键值交换 $dedic = array_flip($dics); //去零 $id = ltrim($ids, $dics[]); //反转 $id = strrev($id); $v = ; for ($i = , $j = strlen($id); $i < $j; $i++) { $v = bcadd(bcmul($dedic[$id { $i } ], bcpow($dnum, $i, ), ), $v, ); } return $v; }
}
我们定义Code类,先定义密码字典,即0-Z分别对应的数值,方法encodeID($int, $format)中参数$int表示数字,$format表示位数长度,比方encodeID(123456789,5)表示将数字123456789转换成5位的36进制编号,而方法decodeID($ids)用于将36进制的编号转换成10进制的编号。
我们可以这样来生成卡号:
$code = new Code(); $card_no = $code->encodeID(,);
如上,我们就可以得到一个5位的卡编号,它实际代表着卡号是888888(6个8)的会员编号,而实际进行转换后是5位编号:0J1VC。
接着,我们将城市编号和校验码加上,城市编号是已经定义好的,校验码则通过一定的算法取得,本例中,我们使用简单的算法:将前三位城市编号和五位卡编号进行md5加密,然后取md5值的前2位作为校验码,这样就得到了编号后面的两位校验码。
$card_pre = ''; $card_vc = substr(md5($card_pre.$card_no),,); $card_vc = strtoupper($card_vc); echo $card_pre.$card_no.$card_vc;
实际应用中,可以通过数据库得到10进制的编号,保证编号唯一,再将上述代码组合,最终生成一个10位的不重复的会员卡号。
来源地址:http://www.lai18.com/content/370267.html
PHP实现生成唯一编号(36进制的不重复编号)的更多相关文章
- Oracle 10进制转36进制
CREATE OR REPLACE FUNCTION IDFMS.func_dec236 (parm IN INT DEFAULT 0) RETURN VARCHAR2IS /* 10进制 ...
- php 36进制与10进制转换
php 36进制与10进制转换 /** * @desc im:十进制数转换成三十六机制数 * @param (int)$num 十进制数 * return 返回:三十六进制数 */ function ...
- ORACLE 36进制和10进制,互相转换函数
第一部分 --36转10进制 create or replace function f_36to10 (str varchar) return int is returnValue int; s ...
- 十进制和n进制的转换(10进制转换为36进制)
答案如下: void Convert() { map<int ,string> maps; maps[0]="0"; maps[1]="1"; ma ...
- 用C#简单实现的36进制转换代码
private const string initValue = "A0000001"; private static string cs = "0123456789AB ...
- PHP生成唯一不重复的编号
当我们要将一个庞大的数据进行编号时,而编号有位数限制,比如5位的车牌号.10位的某证件号码.订单流水号.短网址等等,我们可以使用36进制计算出符合位数的不重复的编号. 下载:https://url72 ...
- PHP生成唯一会员卡号
我们将0-Z(0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ)分别代表数值0-35,如字母Z代表35.这样的话我要得到一个5位的编号,最大信息量就是36的5次方了,36^5 ...
- 转:C#生成唯一值的方法汇总
这篇文章主要介绍了C#生成唯一值的方法汇总,有需要的朋友可以参考一下 生成唯一值的方法很多,下面就不同环境下生成的唯一标识方法一一介绍,作为工作中的一次总结,有兴趣的可以自行测试: 一.在 .NET ...
- C#生成唯一值的方法汇总
生成唯一值的方法很多,下面就不同环境下生成的唯一标识方法一一介绍,作为工作中的一次总结,有兴趣的可以自行测试: https://www.cnblogs.com/xinweichen/p/4287640 ...
随机推荐
- bonjour的使用
os中,bonjour是一个零配置的网络服务分发服务器与客户端. 在使用bonour之前你应该明白的是,bonjour并不负责数据传输,只负责发布服务与检索服务,并在客户端获取服务端的信息. ...
- abp使用风格定义
一个开发人员的开发模式下面.用这个有太多代码要写了.所以需要限制与规范自己: 基于abp新系统的开发过程1>*.Core 增加文件夹eg:Questions1.1>增加实体文件eg:QAQ ...
- RPMforge(Repoforge)源
centos使用rpmforge-release 时间:2017-10-09 09:48:29 阅读:536 评论:0 收藏:0 [点我收藏+] 标签:rpmf ...
- 个人博客开发之 ueditor 安装
- SQL SERVER 2000安装教程图文详解
注意:Windows XP不能装企业版.win2000\win2003服务器安装企业版一.硬件和操作系统要求 下表说明安装 Microsoft SQL Server 2000 或 SQL Server ...
- gradle配置flavors上传nexus服务器
分拆代码的过程中需要把核心代码编译成一个库上传到内部maven服务器上,所以研究了一下上传私库的方法. 首先拆分的是工具类库,这个库和java的库类似,没有配置flavors,所以按照网上通用的方法引 ...
- Servlet 处理日期
使用 Servlet 的最重要的优势之一是,可以使用核心 Java 中的大多数可用的方法.本章将讲解 Java 提供的 java.util 包中的 Date 类,这个类封装了当前的日期和时间. Dat ...
- 补装老版本的Java SE
到oracle注册账号下载bin文件 在bin文件下载目录打开终端复制下面到命令 # chmod +x jdk-6u21-linux-i586.bin 注意版本不同,比如我这次下载到是6u45 chm ...
- Type Group(类型组)
在 APAP 程序开发中, 经常需要定义一些常量或变量, 而且可能存在多个程序中需要用到的类似的变量或结构体, SAP 提供了类型组, 允许用户建立一些公用的对象, 允许在不同的程序中调用, 这样不但 ...
- 怎样在Mac OS X上面指定Eclipse启动时用指定的某一版本号JDK?
编辑 $ECLIPSE_HOME/Eclipse.app/Contents/MacOS/eclipse.ini 文件.在 Finder 中右键或者Ctrl+点击 Eclipse 应用程序.然后点击&q ...