代码收藏系列--php--生成简短唯一订单号

/**
* 生成商家交易单号
* <br />特点:不重复
* <br />示例:
* <br />普通付款:array('shop_id'=>1,'product_id'=>array(1,2,3), 'user_id'=>1, 'ip'=>'127.0.0.1', 'amount'=>0.01, 'timestamp'=>'2017-06-22 18:02:33', 'sign_key'=>'signkey!@#123_') 结果为: ib1bd7s9bc50c787114b195e7
* <br />合并付款:generate_trade_no(array('shop_id'=>1,'product_id'=>array(1,2,3), 'user_id'=>1, 'ip'=>'127.0.0.1', 'amount'=>0.01, 'timestamp'=>'2017-06-22 18:02:33', 'sign_key'=>'signkey!@#123_')) 结果为:ib1bd7rs5c50c787114b195e7
* @param array $data
* @return string 返回30或25位位字符串,格式为: 时间{年月日时分秒,14位}+md5{16位}=30位, 例如: 20170622180940c50c787114b195e7 或 ib1bd7s9bc50c787114b195e7
*/
function generate_trade_no(array $data, $ziptime = true) {
ksort($data); // 根据数组的键值对数组重新排序
$hashtext = md5(json_encode($data)); // 把数组格式化为JSON字符串并生成MD5签名
$time = date('YmdHis');
if ($ziptime) {
$time = base_convert($time, 10, 32); // 使用32进制将14位时间戳压缩到9位32进制值
}
$trade_no = $time . substr($hashtext, 8, 16); // 把MD5签名截取16位, 并在签名加上14位或9位日期时间戳, 组成30位或25位字符串
return $trade_no;
} /**
* php生成32进制8位字符,减轻数据库唯一字段
* <br />背景:
* <br />一般在数据库里唯一字段我们用AUTO_ID或者CRC32或者MD5
* <br />AUTO_ID 10进制根据数据列长度,一般是初学者用,应为在高级应用里不灵活
* <br />CRC32 16进制8位,很直观,但是重复几率要比 MD5高,
* <br />MD5 16进制32位,不直观,太占数据库唯一字段,数据选择压力大。
* <br />最近2天一直在研究如何PHP做一个既有MD5的唯一能力又减少位数用在数据库开发里
* <br />想到压缩MD5为32进制8位,下面是函数,希望大家测试或者给点意见,或者有更灵活的方法
* <br />see: http://www.myexception.cn/database/832012.html
* <br />示例:only('a') 结果是: H1N29LQ1
* @param string $instr
* @return string 返回8位字符串
*/
function only($instr) {
$instr = md5($instr, true);
$dict = '0123456789ABCDEFGHIJKLMNOPQRSTUV';
$outstr = '';
for ($i = 0; $i < 8; $i++) {
$ord = ord($instr[$i]);
$outstr .= $dict[( $ord ^ ord($instr[$i + 8]) ) - $ord & 0x1F];
}
return $outstr;
} /**
* 把12位时间数值压缩成8-9位字母+数字组合字符串
* <br />重点是加上用户编号后将永不重复!
* <br />用途:订单号、交易号、唯一号
* <br />如:
* <br />timeserialize(date('y-m-d-H-i-s')), 结果是:RGXO3128
* <br />timeserialize('17-12-31-23-59-59'), 结果是:RM31X5959
* <br />timeserialize('50-12-31-23-59-59'), 结果是:2M31X5959
* <br />timeserialize('0-0-0-0-0-0'), 结果是:AAAAAA
* <br />timeserialize('99-99-99-99-99-99'), 结果是:99999999999999
* @return string 返回8-9位字母+数字组合字符串
* @since VER:1.0; DATE:2016-1-21; AUTHOR:SoChishun; EMAIL:14507247@qq.com; DESC:Added.
*/
function timeserialize($time = '') {
if (!$time) {
$time = date('y-m-d-H-i-s');
}
echo '<div>', $time, '</div>';
$atime = explode('-', $time);
$outstr = '';
// ASCII表:48(0)-57(9), 65(A)-90(Z), 97(a)-122(z)
// 有效压缩范围:0-25, 48-57
foreach ($atime as $stime) {
$itime = $stime * 1;
echo $itime, ',';
// 如果数值小于26,则转换成ASCII表的字母,这样可以把两位的数值变成一位字母
if ($itime < 26) {
// 65(A)-90(Z)
$outstr .= chr(65 + $itime);
continue;
}
// 48(0)-57(9)
// 如果数值在48-57之间,则转换成ASCII表的数字,把两位数转变为1数字
if ($itime >= 48 && $itime <= 57) {
$outstr .= chr($stime);
continue;
}
$outstr .= $stime;
}
return $outstr;
}

版权声明:本文采用署名-非商业性使用-相同方式共享(CC BY-NC-SA 3.0 CN)国际许可协议进行许可,转载请注明作者及出处。
本文标题:代码收藏系列--php技巧--生成简短唯一订单号
本文链接:http://www.cnblogs.com/sochishun/p/7070365.html
本文作者:SoChishun (邮箱:14507247#qq.com | 博客:http://www.cnblogs.com/sochishun/)
发表日期:2017年6月23日

代码收藏系列--php--生成简短唯一订单号(转载)的更多相关文章

  1. 代码收藏系列--php--生成简短唯一订单号

    /** * 生成商家交易单号 * <br />特点:不重复 * <br />示例: * <br />普通付款:array('shop_id'=>1,'prod ...

  2. Java订单号生成,唯一订单号(日均千万级别不重复)

    Java订单号生成,唯一订单号 相信大家都可以搜索到很多的订单的生成方式,不懂的直接百度.. 1.订单号需要具备以下几个特点. 1.1 全站唯一性. 1.2 最好可读性. 1.3 随机性,不能重复,同 ...

  3. 全局唯一订单号生成方法(参考snowflake)

    backgroud Snowflake is a network service for generating unique ID numbers at high scale with some si ...

  4. 代码收藏系列--javascript--日期函数

    /** * 获取当前时间的简短函数 * @returns {String} * @@example getTimeStamp() 结果是:2017-07-12 09:21:30 */ function ...

  5. 代码收藏系列--mysql--创建数据库、数据表、函数、存储过程命令

    创建mysql数据库 CREATE DATABASE IF NOT EXISTS `database_name` DEFAULT CHARSET utf8 COLLATE utf8_general_c ...

  6. php生成唯一订单号

    支持更改长度/** * 生成唯一订单号 * */ function build_order_no(){ return date('Ymd').substr(implode(NULL, array_ma ...

  7. php生成唯一id/唯一标识符/唯一订单号

    /** * php 生成唯一id * https://blog.csdn.net/hzqghost/article/details/18914681 */ function guid($factor= ...

  8. 代码收藏系列--jquery--筛选器、事件绑定技巧

    Jquery筛选器的一些常用技巧,比如过滤属性等 /* 过滤获取没有含data-xsui-grid-colspan的节点 */$(this).find('.xsui-grid-cell:not([da ...

  9. 代码收藏系列--javascript--移动端技巧

    JS判断是否是手机端访问: var is_mobi = navigator.userAgent.toLowerCase().match(/(ipod|iphone|android|coolpad|mm ...

随机推荐

  1. CSS外框高度自动适应

    当有浮动float时,最外框会不跟随内容的高度而高: 解决办法一:清除浮动  clear:both <!DOCTYPE html> <html xmlns="http:// ...

  2. 当Ruby的model名字出错时,在现实view时显示错误的提示

    app/controllers/courses_controller.rb:1:in `<top (required)>' app/controllers/courses_controll ...

  3. 第六周 Word目录和索引

    第六周 Word目录和索引 教学时间 2013-4-2 教学课时 2 教案序号 5 教学目标 能正确使用索引.目录等 教学过程: 复习提问 1.脚注和尾注的区别是什么?2.如何插入脚注和尾注?3.如何 ...

  4. 升级华为s2016

    Part 1 升级Bootrom 概述:启动启动菜单,用xmodem协议升级BootRom 升级的文件如下: wnm2.2.3-0004.zip :web网管zip压缩包文件. S2008_16-VR ...

  5. Iterator接口用法

    1.所有实现Collection接口的容器类都有一个iteractor方法,用于返回一个实现了Iteractor接口的对象, 2.Iteractor对象成为迭代器,用以实现对容器内元素的遍历操作 3. ...

  6. IDEA Run/Debug Configurations 中点击“+”号没有tomcat server选项

    环境: 版本:IntelliJ IDEA 2016.3.2系统:windows7 32位 / ubuntu上通用 2.问题: 在IDEA中,对每一个web项目都要配置tomcat服务器,如果你是第一次 ...

  7. ldd 以及 ld-linux.so.2

    最近跟编译工具干上了,可能是问题积累集中爆发的结果. 今天对 ld-linux.so.x 有很大兴趣,想对它多些了解,遂百度之.发现了指令 ldd. 关于 ldd 其实 ldd 是一个脚本,并不是一个 ...

  8. Java多线程之Semaphore信号量

      转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6557874.html  学过操作系统的对 信号量 这个词应该不陌生,它是用来进行进程间通信,控制对 临界区 ...

  9. kettle的安装、配置与运行

      1.下载与安装 官方下载地址:https://community.hitachivantara.com/docs/DOC-1009855 下载好后,解压,还可以对该目录进行重命名. 2.环境配置 ...

  10. eclipse mavenWeb项目真正实现热部署(修改java代码和页面文件不用重启tomcat)

            1.前言 首先,本文创作灵感源于博客园园作者signheart,特此鸣谢!原文链接见文末推荐: 百度都搜破了,全网讲的都是如何将maven项目部署到tomcat上,对于热部署的认知,真 ...