业务流水号(交易号)生成方法
概述
在大流量下订单号生成方法一文中介绍了如何生成不重复的订单号,主要原理是利用数据库自增ID。但是像业务流水号之类的,其实不利用数据库也是可以的,只是要保证唯一性,做起来不太好做。下文介绍一种方法来生成流水号,如果不是那种特别变态的调用量,产生重复的机会还是很少的。但是如果是那种无论如何都不能重复的,不建议用本文的方法了。
流水号生成规则
时间+四位的机器号+10位的随机数
时间的生成
时间的话,可以使用下面的方式来生成。
FastDateFormat.getInstance("yyyyMMddHHmmssSSS").format(new Date()))
使用apache的FastDateFormat线程安全的格式化时间,到毫秒。注意千万别用JAVA自带的SimpleDateFormat
,不是线程安全的,如果你一定要用SimpleDateFormat
的话,需要结合ThreadLocal
来实现。
机器号
这个可以先用JAVA代码获取机器的MAC地址。如何获取机器的MAC地址的代码,网上大把,这里贴一个用过的。
private static String getMacAddress() throws Exception {Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();while (networkInterfaces.hasMoreElements()) {NetworkInterface networkInterface = networkInterfaces.nextElement();if (null == networkInterface) {continue;}byte[] macBytes = networkInterface.getHardwareAddress();if (networkInterface.isUp() && !networkInterface.isLoopback() && null != macBytes && macBytes.length == 6) {StringBuilder sb = new StringBuilder();for (int i = 0, nLen = macBytes.length; i < nLen; i++) {byte b = macBytes[i];sb.append(Integer.toHexString((b & 240) >> 4));sb.append(Integer.toHexString(b & 15));if (i < nLen - 1) {sb.append("-");}}return sb.toString().toUpperCase();}}return null;}
上面的代码就获取到MAC地址,格式是:
xx-xx-xx-xx-xx-xx
得到MAC地址后,可以根据MAC地址获取它对应的CRC16校验码,可以简单的使用如下代码来获取:
private static int getCRC16Code(String macAddress) {if (null == macAddress) {return 0;}byte[] data = macAddress.getBytes(Charset.forName("utf-8"));CRC16 crc16 = new CRC16();for (byte b : data) {crc16.update(b);}return crc16.value;}
接下来可以根据这个CRC16校验码截取高四位。这个代码比较简单,就不贴了。
另外,也见过机器号是通过环境变量来读取的,把机器号配置在环境变量中,然后直接在代码里读取。也见过在配置中心配置的。
生成随机数
可以利用JAVA的AtomicInteger
来生成。
总结
如果你的应用是要给对方提供流水号的,那么如果对方使用for循环并且并发调用,还是有可能生成重复的流水号的,这种情况下,最好在客户端调用的时候,在for循环里sleep 一毫秒,降低并发。
另外有个建议,如果是对方的接口要求你传入一个唯一的流水号,最好在生成的流水号上加上自己系统的名字,这样服务方也可以通过看流水号,就知道是哪个系统过来的。
2018 博客之星
我最近在参与CSDN的博客之星评选,希望您投下宝贵的一票,多多支持我继续写博客,谢谢。
CSDN 2018博客之星,需要您投上宝贵的一票
业务流水号(交易号)生成方法相关推荐
- opencart修改订单号生成方法
opencart 的订单号 因为系统限制了int类型 所以只有10位 写成 年月日时分秒 的话 时显超过了限制 我写成了 月日时分秒 catalog/model/checkout/order.php ...
- android 订单生成规则,订单号生成方法
package com.jae.impl; import java.text.ParseException; import java.text.SimpleDateFormat; import jav ...
- 商户流水号生成方法-带序列号
** 商户流水号和订单号生成方法-带序列号 每次在对接支付平台,第三方收单接口和小程序时,需要用到订单号或者商户流水号来检验唯一性,一般前缀+日期+随机数+后缀格式,自动生成:虽然能保证唯一性,但看上 ...
- php订单怎么生成,四种PHP生成唯一订单号的方法
这几天一直在写个人使用的用户中心,虽然期间遇到不少的问题,但还是一点点的都解决了,也从制作期间学到不少的知识,今天就说一说利用PHP生成订单单的方法. 订单号,大家都不陌生,无论从在网上购物,还是在线 ...
- 一个交易号的生成和还原过程
需求是一个同学给的,我帮他做完,记录下. 需求如下: 业务变更内容及需求确认: 1. 原交易序号-->算法-->打乱交易序号 2. 打乱 ...
- 简单介绍订单号或者流水号的生成方法
一般订单号或者流水号等可能在一些平台会用到,然后我就简单的介绍一个我自己生成订单号和流水号的一个方法吧,如果程序有问题或者你有更好的生成办法,欢迎留言,留下你的文章链接,我们一起学习和进步哈. 方法简 ...
- 公众号生成微信渠道二维码的方法?
2019独角兽企业重金招聘Python工程师标准>>> 微信公众号有一个默认的二维码,不同渠道投放的都是同一个二维码信息,那么无法知道用户是从哪个渠道关注的.所以现在需要渠道二维码, ...
- CNN可视化又添新作,南大开源Group-CAM:高效的显著图生成方法|CVPR2021
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨孙裕道 审稿丨邓富城 编辑丨极市平台 导读 最近南京大学的一篇论文收录于CVPR2021,该论文 ...
- UUID介绍与生成方法
什么是UUID? UUID是Universally Unique Identifier的缩写,它是在一定的范围内(从特定的名字空间到全球)唯一的机器生成的标识符.UUID具有以下涵义: 经由一定的算法 ...
最新文章
- Inline Hook
- python 将dataframe中的str都转化成float_【Python自学笔记】一次不太成功的利用Python整理的利润表实践...
- delphi 登录界面 主窗体 切换_Python GUI项目实战(二)主窗体的界面设计与实现
- nested exception is java.lang.NoClassDefFoundError: org/codehaus/jettison/json/JSONObject异常的解决办法
- 电池pack结构_锂电池pack性能测试标准,电池测试模组就选弹片微针模组
- 未来人在数据分析中的角色转变
- 【CPLEX教程01】Cplex介绍,下载和安装Cplex
- win10安装Mujoco150和mujoco-py 1.50.1.0
- 神经网络学习小记录59——Pytorch搭建常见分类网络平台(VGG16、MobileNetV2、ResNet50)
- U盘数据恢复软件推荐
- 音视频编解码之路:JPEG编码
- wuauclt.exe进程和wuauclt病毒的查杀清理方法
- 必杀VI、VIM编辑器命令
- python表示分数_python分数怎么表示什么
- 偷偷看,别让老板发现了...微信如何多开,实现工作号和私人号分离|亲测,win系列所有系统都可以实现
- Criteria教程
- 中国计算机水平低是因为工程水平差
- 【cpu100%查不到具体的进程】
- 未明学院:大学生如何增强自己的知识储备?要是读书时知道这些就好了!
- JTAG unlock
热门文章
- 电容式液晶屏可实现多点触控
- 「Photoshop2021入门教程」新功能——快速操作
- 计算机视觉论文-2021-05-28
- 【现控】时不变连续系统
- 没有公网IP,自建网站如何让外网访问?
- 微信营销的技巧有哪些 微信营销取名的禁忌 微信内容写作的七个要点
- 使用yagmail模块群发工资条
- 赵丽颖冯绍峰结婚官宣!深扒2人10亿商业关系:女方年入过亿,男方是乐视股东...
- phpmyadmin 4.8.1 Remote File Inclusion Vulnerability (CVE-2018-12613)漏洞复现
- 作业20171127-4 事后诸葛亮会议