java雪花算法

本文介绍了雪花算法在生成18位唯一ID的应用,主要用于创建如订单ID等。相较于普通自增ID,雪花算法能防止通过ID推算日期信息,提供额外的安全性。文章还分享了一段Java代码实现。
摘要由CSDN通过智能技术生成

使用场景 : 雪花算法能生成唯一18位id , 适用于生成订单id等 , 优点普通自增id , 可能通过id计算出当天或本月的销量 , 雪花算法可以避免这个问题

java代码实现

class SnowFlake {


// ==============================Fields===========================================
/** 开始时间截 (2015-01-01) */
private static final long twepoch = 1420041600000L;

/** 机器id所占的位数 */
private static final long workerIdBits = 5L;

/** 数据标识id所占的位数 */
private static final long datacenterIdBits = 5L;

/** 支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数) */
private static final long maxWorkerId = -1L ^ (-1L << workerIdBits);

/** 支持的最大数据标识id,结果是31 */
private static final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);

/
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java雪花算法是一种用于生成唯一ID的算法,它可以在分布式系统中生成全局唯一的ID。下面是Java雪花算法生成ID的介绍: 1. 雪花算法的原理: 雪花算法使用一个64位的整数来表示生成的ID,其中包含了以下几个部分: - 时间戳:占用41位,精确到毫秒级别,可以支持约69年的时间戳。 - 机器ID:占用10位,用于标识不同的机器,可以支持最多1024台机器。 - 序列号:占用12位,用于标识同一毫秒内生成的不同ID,可以支持每台机器每毫秒生成最多4096个ID。 2. Java实现雪花算法生成ID的步骤: - 定义一个起始时间戳,作为基准时间。 - 获取当前时间戳,并与基准时间进行比较,计算出时间差。 - 根据时间差、机器ID和序列号生成一个64位的ID。 3. Java代码示例: ```java public class SnowflakeIdGenerator { private static final long START_TIMESTAMP = 1609459200000L; // 2021-01-01 00:00:00 private static final long MACHINE_ID_BITS = 10L; private static final long SEQUENCE_BITS = 12L; private static final long MAX_MACHINE_ID = ~(-1L << MACHINE_ID_BITS); private static final long MAX_SEQUENCE = ~(-1L << SEQUENCE_BITS); private static final long MACHINE_ID_SHIFT = SEQUENCE_BITS; private static final long TIMESTAMP_SHIFT = MACHINE_ID_BITS + SEQUENCE_BITS; private static final long MACHINE_ID = getMachineId(); // 获取机器ID private static long lastTimestamp = 0L; private static long sequence = 0L; public synchronized static long generateId() { long currentTimestamp = System.currentTimeMillis(); if (currentTimestamp < lastTimestamp) { throw new RuntimeException("Clock moved backwards. Refusing to generate id."); } if (currentTimestamp == lastTimestamp) { sequence = (sequence + 1) & MAX_SEQUENCE; if (sequence == 0) { currentTimestamp = waitNextMillis(currentTimestamp); } } else { sequence = 0L; } lastTimestamp = currentTimestamp; return ((currentTimestamp - START_TIMESTAMP) << TIMESTAMP_SHIFT) | (MACHINE_ID << MACHINE_ID_SHIFT) | sequence; } private static long waitNextMillis(long currentTimestamp) { while (currentTimestamp <= lastTimestamp) { currentTimestamp = System.currentTimeMillis(); } return currentTimestamp; } private static long getMachineId() { // 根据实际情况获取机器ID,可以使用IP地址、MAC地址等方式 // 这里简化为固定的一个值 return 1L; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值