Java 终端设备消息ID-雪花算法简化版
一、雪花算法-简化版
雪花算法(SnowFlake)是推特(Twitter)开源的分布式高并发环境生成消息唯一ID的方案,目前被广泛使用。 雪花算法相对UUID来说是有序的,它产生的ID是一个64位的long型数据,由固定值+时间戳+机器ID+序号组成,但传统行业的终端设备其实并不需要如此复杂的算法,那么今天我们就保留核心的部分,来实现一个简化的版本。
二、代码示例
简化版的雪花算法:unix时间戳 + 6位随机数 + 6位序列号 + 设备号 实际过程中6位随机数仅是作为冗余手段引入的,可以注释掉随机数部分的代码
package com.company.example;
import java.security.SecureRandom;
public class Utills {
static final SecureRandom numberGenerator = new SecureRandom();
static final long SEQUENCE_BIT = 6; // 序列号占用的位数
static final long MAX_SEQUENCE = -1L ^ (-1L << SEQUENCE_BIT); // 序列号最大值
static long SEQUENCE = 0L; // 毫秒内序列号
static long LASTSTMP = -1L;// 上一次时间戳
/**
* 生成唯一消息ID
*/
public static String generateMessageID(String deviceNo){
// 生成6位随机数
int random = numberGenerator.nextInt(1000000);
// 自增序列号
// 时间戳 + 毫秒内6位序列号
long timeStamp = System.currentTimeMillis();
if(LASTSTMP == timeStamp){
SEQUENCE = (SEQUENCE + 1) & MAX_SEQUENCE;
if (SEQUENCE == 0L) {
while(LASTSTMP == timeStamp){
timeStamp = System.currentTimeMillis();
}
}
} else {
SEQUENCE = 0L;
}
LASTSTMP = timeStamp;
// 消息ID: unix时间戳 + 6位随机数 + 6位序列号 + 设备号
return timeStamp + String.format("%06d", random) + String.format("%06d", SEQUENCE) + deviceNo;
}
}
三、总结
复杂的雪花算法核心的思想是:当前时间戳和上次时间戳比较,相等的情况下序列号自增(如果序列号已达最大,则死循环直到下一个时间戳),再与时间戳、设备号组合为一个ID。 利用雪花算法的关键部分,我们可以实现一个简单的消息ID生成器,适用于小型的并发环境。
下一篇:
高校人力管理系统(C#毕业设计)
