全局唯一编码ID生成器

package com.util;import java.lang.management.ManagementFactory;
import java.net.NetworkInterface;
import java.nio.BufferUnderflowException;
import java.nio.ByteBuffer;
import java.security.SecureRandom;
import java.util.Enumeration;import org.apache.commons.lang3.time.DateFormatUtils;/*** <p>* 全局唯一ID生成器,31位:17位毫秒时间戳(格式化后)+9位机器码和进程号+5位循环序列号* </p>* <p>* 全局唯一ID生成器,27位:13位毫秒数时间戳(无格式化)+9位机器码和进程号+5位循环序列号* </p>*/
public class GeneratorId {public static void main(String[] args) {long a = System.currentTimeMillis();for (int i = 0; i < 100; i++) {System.out.println(nextFormatId());nextFormatId();}System.out.println(System.currentTimeMillis() - a);System.out.println(nextMillisId());}/*** 流水号起始值*/private static final long MIN_SEQUENCE = 10000L;/*** 流水号最大值*/private static final long MAX_SEQUENCE = 99999L;/*** 流水号,在最小最大值之间循环,避免唯一ID的安全性泄露,时间戳精确到毫秒,单机在1毫秒内也不可能生成近十万个业务ID*/private static long sequence = MIN_SEQUENCE;/*** 机器码 加 进程号 会导致生成的序列号很长, 基于这两个值做一些截取*/private static final String MP;static {try {// 机器码 --> 本机 mac 地址的 hashcode 值int machineIdentifier = createMachineIdentifier();// 进程号 --> 当前运行的 jvm 进程号的 hashcode 值int processIdentifier = createProcessIdentifier();int hashcode = (machineIdentifier + "" + processIdentifier).hashCode();String mp = "";if (hashcode != Integer.MIN_VALUE) {mp = Integer.toString(Math.abs(hashcode));} else {mp = Integer.toString(Integer.MIN_VALUE);}MP = mp;} catch (Exception e) {throw new RuntimeException(e);}}private GeneratorId() {}/*** 全局唯一ID生成器,31位:17位毫秒时间戳(格式化后)+9位机器码和进程号+5位循环序列号*/public static synchronized String nextFormatId() {return DateFormatUtils.format(System.currentTimeMillis(), "yyyyMMddHHmmssSSS") + MP+ nextSequence();}/*** 全局唯一ID生成器,27位:13位毫秒数时间戳(无格式化)+9位机器码和进程号+5位循环序列号*/private static synchronized String nextMillisId() {return System.currentTimeMillis() + MP + nextSequence();}/*** 生成下一个序列号*/private static synchronized long nextSequence() {if (sequence >= MAX_SEQUENCE) {sequence = MIN_SEQUENCE;}++sequence;return sequence;}/*** 获取机器标识符*/private static int createMachineIdentifier() {// build a 2-byte machine piece based on NICs infoint machinePiece;try {StringBuilder stringBuilder = new StringBuilder();Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();while (networkInterfaces.hasMoreElements()) {NetworkInterface networkInterface = networkInterfaces.nextElement();stringBuilder.append(networkInterface.toString());byte[] mac = networkInterface.getHardwareAddress();if (mac != null) {ByteBuffer byteBuffer = ByteBuffer.wrap(mac);try {stringBuilder.append(byteBuffer.getChar());stringBuilder.append(byteBuffer.getChar());stringBuilder.append(byteBuffer.getChar());} catch (BufferUnderflowException shortHardwareAddressException) { // NOPMD// mac with less than 6 bytes. continue}}}machinePiece = stringBuilder.toString().hashCode();} catch (Throwable t) {// exception sometimes happens with IBM JVM, use randommachinePiece = new SecureRandom().nextInt();}return machinePiece;}/*** 获取JVM进程号,这并不是每个类装入器,因为必须是唯一的*/private static int createProcessIdentifier() {int processId;try {String processName = ManagementFactory.getRuntimeMXBean().getName();if (processName.contains("@")) {processId = Integer.parseInt(processName.substring(0, processName.indexOf('@')));} else {processId = processName.hashCode();}} catch (Throwable t) {processId = new SecureRandom().nextInt();}return processId;}}

全局唯一编码ID生成器相关推荐

  1. 根据redis自增生成全局唯一订单id

    根据redis自增生成全局唯一订单id package com.example.springbootshardingjdbc.util;import java.time.LocalDateTime; ...

  2. 【283期】面试官问:高并发场景下,如何保证全局唯一分布式 ID 生成?

    点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每一天进步一点点,是成功的开始... 前言 系统 ...

  3. java 自定义自增_自定义全局自增ID生成器

    看了网上很多生成自增ID的策略,最终给出的都是雪花算法,leaf算法.但是却没有满足咱们对于自定义生成规则的需求. 在业务上有一部分ID往往是有规则的,比如某个产品的订单号往往是"产品标志+ ...

  4. 一个生成全局唯一Sequence ID的高并发工厂类 (Java)

    为什么80%的码农都做不了架构师?>>>    Sequence是数据库系统按照一定规则自动增加的数字序列.这个序列一般作为代理主键(因为不会重复),没有其他任何意义. Sequen ...

  5. JS如何生成多个独一无二全局唯一的(id)Key

    1.下载包  yarn add uuid 2.引入     import {v4 as uuid} from 'uuid' 3.使用 list:[ { id:uuid(), name:张三, age: ...

  6. 全局唯一ID发号器的几个思路

    标识(ID / Identifier)是无处不在的,生成标识的主体是人,那么它就是一个命名过程,如果是计算机,那么它就是一个生成过程.如何保证分布式系统下,并行生成标识的唯一与标识的命名空间有着密不可 ...

  7. 如何在高并发分布式系统中生成全局唯一Id

    又一个多月没冒泡了,其实最近学了些东西,但是没有安排时间整理成博文,后续再奉上.最近还写了一个发邮件的组件以及性能测试请看 <NET开发邮件发送功能的全面教程(含邮件组件源码)> ,还弄了 ...

  8. java产生全局唯一的int类型_全局唯一ID设计

    在分布式系统中,经常需要使用全局唯一ID查找对应的数据.产生这种ID需要保证系统全局唯一,而且要高性能以及占用相对较少的空间. 全局唯一ID在数据库中一般会被设成主键,这样为了保证数据插入时索引的快速 ...

  9. 微信用户全局唯一标识_分布式系统的唯一ID生成算法对比

    在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识. 那么如何实现全局唯一id呢?有以下几种方案. (1)方案一:独立数据库自增id 这个方案就是说你的系统每次要生成一个id,都是往一个独立库 ...

  10. 全局唯一递增的id_分布式ID生成方法-趋势有序的全局唯一ID

    一.需求缘起 几乎所有的业务系统,都有生成一个记录标识的需求,例如: (1)消息标识:message-id (2)订单标识:order-id (3)帖子标识:tiezi-id 这个记录标识往往就是数据 ...

最新文章

  1. JavaScript Tween算法及缓动效果
  2. c# 基于layui的通用后台管理系统_【SpringBoot】三十三、SpringBoot+LayUI后台管理系统开发脚手架...
  3. sqlmap安装及问题汇总
  4. 简单举例JAVA回调函数的实现
  5. 数字一阶低通滤波器立体解析
  6. MESYS轴承计算设计软件直播回顾
  7. GRBL分析:gcode解释器(一)
  8. C语音音乐旋律代码-网络神曲
  9. 翻炒《天龙八部》[转]
  10. JUNOS的基本操作
  11. 统计学总结之Bias(偏差),Error(误差),和Variance(方差)的区别
  12. 使用python计算一年有多少秒_python获取一年所有的日期
  13. 浅析供应链金融业务发展态势及提升路径
  14. C# 屏蔽Ctrl Alt Del 快捷键方法+屏蔽所有输入
  15. 帆软内SQL语句的使用
  16. 如何在hosts文件添加自己想要解析的网站?及修改hosts的作用
  17. ArcMap学习笔记(七)地图制作
  18. 黑客攻防实战,黑客入门到精通,收藏这一篇就够了
  19. 文档流,浮动,定位的区别和处理
  20. STM32F4移植FreeRTOS V10.3.1

热门文章

  1. 解决:IDEA2017/2019与Maven3.6.3不兼容的导致的unable to import maven project: see logs for details问题
  2. 【总结】操作系统原理
  3. 如何使用USGS下载DEM数据
  4. iOS开发,自定义字体,字体名称查询
  5. 数据库之常用SQL语句整合
  6. win10的 程序员计算器
  7. 清华大学计算机专业在职博士吧,清华大学在职博士含金量高吗?
  8. 快速获得CSDN积分的技巧
  9. 酒店管理系统数据库设计说明书
  10. 深入学习jquery源码之show()和hide()