概述


在大流量下订单号生成方法一文中介绍了如何生成不重复的订单号,主要原理是利用数据库自增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博客之星,需要您投上宝贵的一票

业务流水号(交易号)生成方法相关推荐

  1. opencart修改订单号生成方法

    opencart 的订单号 因为系统限制了int类型 所以只有10位 写成  年月日时分秒 的话 时显超过了限制 我写成了 月日时分秒 catalog/model/checkout/order.php ...

  2. android 订单生成规则,订单号生成方法

    package com.jae.impl; import java.text.ParseException; import java.text.SimpleDateFormat; import jav ...

  3. 商户流水号生成方法-带序列号

    ** 商户流水号和订单号生成方法-带序列号 每次在对接支付平台,第三方收单接口和小程序时,需要用到订单号或者商户流水号来检验唯一性,一般前缀+日期+随机数+后缀格式,自动生成:虽然能保证唯一性,但看上 ...

  4. php订单怎么生成,四种PHP生成唯一订单号的方法

    这几天一直在写个人使用的用户中心,虽然期间遇到不少的问题,但还是一点点的都解决了,也从制作期间学到不少的知识,今天就说一说利用PHP生成订单单的方法. 订单号,大家都不陌生,无论从在网上购物,还是在线 ...

  5. 一个交易号的生成和还原过程

    需求是一个同学给的,我帮他做完,记录下. 需求如下: 业务变更内容及需求确认: 1.              原交易序号-->算法-->打乱交易序号 2.              打乱 ...

  6. 简单介绍订单号或者流水号的生成方法

    一般订单号或者流水号等可能在一些平台会用到,然后我就简单的介绍一个我自己生成订单号和流水号的一个方法吧,如果程序有问题或者你有更好的生成办法,欢迎留言,留下你的文章链接,我们一起学习和进步哈. 方法简 ...

  7. 公众号生成微信渠道二维码的方法?

    2019独角兽企业重金招聘Python工程师标准>>> 微信公众号有一个默认的二维码,不同渠道投放的都是同一个二维码信息,那么无法知道用户是从哪个渠道关注的.所以现在需要渠道二维码, ...

  8. CNN可视化又添新作,南大开源Group-CAM:高效的显著图生成方法|CVPR2021

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨孙裕道 审稿丨邓富城 编辑丨极市平台 导读 最近南京大学的一篇论文收录于CVPR2021,该论文 ...

  9. UUID介绍与生成方法

    什么是UUID? UUID是Universally Unique Identifier的缩写,它是在一定的范围内(从特定的名字空间到全球)唯一的机器生成的标识符.UUID具有以下涵义: 经由一定的算法 ...

最新文章

  1. Inline Hook
  2. python 将dataframe中的str都转化成float_【Python自学笔记】一次不太成功的利用Python整理的利润表实践...
  3. delphi 登录界面 主窗体 切换_Python GUI项目实战(二)主窗体的界面设计与实现
  4. nested exception is java.lang.NoClassDefFoundError: org/codehaus/jettison/json/JSONObject异常的解决办法
  5. 电池pack结构_锂电池pack性能测试标准,电池测试模组就选弹片微针模组
  6. 未来人在数据分析中的角色转变
  7. 【CPLEX教程01】Cplex介绍,下载和安装Cplex
  8. win10安装Mujoco150和mujoco-py 1.50.1.0
  9. 神经网络学习小记录59——Pytorch搭建常见分类网络平台(VGG16、MobileNetV2、ResNet50)
  10. U盘数据恢复软件推荐
  11. 音视频编解码之路:JPEG编码
  12. wuauclt.exe进程和wuauclt病毒的查杀清理方法
  13. 必杀VI、VIM编辑器命令
  14. python表示分数_python分数怎么表示什么
  15. 偷偷看,别让老板发现了...微信如何多开,实现工作号和私人号分离|亲测,win系列所有系统都可以实现
  16. Criteria教程
  17. 中国计算机水平低是因为工程水平差
  18. 【cpu100%查不到具体的进程】
  19. 未明学院:大学生如何增强自己的知识储备?要是读书时知道这些就好了!
  20. JTAG unlock

热门文章

  1. 电容式液晶屏可实现多点触控
  2. 「Photoshop2021入门教程」新功能——快速操作
  3. 计算机视觉论文-2021-05-28
  4. 【现控】时不变连续系统
  5. 没有公网IP,自建网站如何让外网访问?
  6. 微信营销的技巧有哪些 微信营销取名的禁忌 微信内容写作的七个要点
  7. 使用yagmail模块群发工资条
  8. 赵丽颖冯绍峰结婚官宣!深扒2人10亿商业关系:女方年入过亿,男方是乐视股东...
  9. phpmyadmin 4.8.1 Remote File Inclusion Vulnerability (CVE-2018-12613)漏洞复现
  10. 作业20171127-4 事后诸葛亮会议