news 2026/5/16 18:08:26

UUID SnowflakeId

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UUID SnowflakeId
UUID & SnowflakeId 雪花算法
package id; import java.util.UUID; /** * UUID * * @author ZengWenFeng * @date 2019.09.21 * @email 117791303@QQ.com * @mobile 13805029595 */ public class UuidUtil { // 带横线UUID public static String getUuid() { return UUID.randomUUID().toString(); } // 去除横线纯32位UUID public static String getSimpleUuid() { return UUID.randomUUID().toString().replace("-", ""); } public static void main(String[] args) { System.out.println(getUuid()); System.out.println(getSimpleUuid()); } }
package id; /** * 雪花算法 ID 生成器 * 结构:0(符号位) + 41位时间戳 + 10位机器ID + 12位序列号 * * @author ZengWenFeng * @date 2019.09.21 * @email 117791303@QQ.com * @mobile 13805029595 */ public class SnowflakeIdGenerator { // 起始时间戳:2025-01-01 00:00:00 private static final long START_TIMESTAMP = 1735689600000L; // 机器ID位数 private static final long WORKER_ID_BITS = 10L; // 序列号位数 private static final long SEQUENCE_BITS = 12L; // 机器ID最大值 private static final long MAX_WORKER_ID = (1L << WORKER_ID_BITS) - 1; // 序列号最大值 private static final long MAX_SEQUENCE = (1L << SEQUENCE_BITS) - 1; // 机器ID左移位数 private static final long WORKER_ID_SHIFT = SEQUENCE_BITS; // 时间戳左移位数 private static final long TIMESTAMP_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS; // 机器ID private final long workerId; // 同一毫秒内序列号 private long sequence = 0L; // 上一次生成ID时间戳 private long lastTimestamp = -1L; public SnowflakeIdGenerator(long workerId) { if (workerId < 0 || workerId > MAX_WORKER_ID) { throw new IllegalArgumentException("机器ID范围 0~" + MAX_WORKER_ID); } this.workerId = workerId; } /** * 生成唯一ID */ public synchronized long nextId() { long currentTimestamp = getCurrentTime(); // 1. 时钟回拨处理 if (currentTimestamp < lastTimestamp) { throw new RuntimeException("系统时钟回拨,拒绝生成ID,差值:" + (lastTimestamp - currentTimestamp) + "ms"); } // 2. 同一毫秒内,自增序列号 if (currentTimestamp == lastTimestamp) { sequence = (sequence + 1) & MAX_SEQUENCE; // 序列号用尽,等待下一毫秒 if (sequence == 0) { currentTimestamp = waitNextMillis(lastTimestamp); } } else { // 新毫秒重置序列号 sequence = 0L; } lastTimestamp = currentTimestamp; // 拼接ID return ((currentTimestamp - START_TIMESTAMP) << TIMESTAMP_SHIFT) | (workerId << WORKER_ID_SHIFT) | sequence; } /** * 等待下一毫秒 */ private long waitNextMillis(long lastTs) { long ts = getCurrentTime(); while (ts <= lastTs) { ts = getCurrentTime(); } return ts; } private long getCurrentTime() { return System.currentTimeMillis(); } // 测试 public static void main(String[] args) { // 单机部署 workerId 填 0 即可,分布式不同机器配置不同ID SnowflakeIdGenerator generator = new SnowflakeIdGenerator(0); for (int i = 0; i < 10; i++) { System.out.println(generator.nextId()); } } }

package id; import java.util.UUID; import java.util.concurrent.CountDownLatch; /** * 测试 * * @author ZengWenFeng * @date 2019.09.21 * @email 117791303@QQ.com * @mobile 13805029595 */ public class IdPerformanceTest { public static void main(String[] args) throws InterruptedException { int threadNum = 10; int countPerThread = 100000; final CountDownLatch latch = new CountDownLatch(threadNum); final SnowflakeIdGenerator snow = new SnowflakeIdGenerator(0); // 雪花算法压测 long startSnow = System.currentTimeMillis(); for (int t = 0; t < threadNum; t++) { new Thread(new Runnable() { public void run() { for (int i = 0; i < countPerThread; i++) { snow.nextId(); } latch.countDown(); } }).start(); } latch.await(); long snowCost = System.currentTimeMillis() - startSnow; System.out.println("SnowflakeId 10线程共" + threadNum * countPerThread + "个ID,耗时:" + snowCost + "ms"); // UUID压测 final CountDownLatch uuidLatch = new CountDownLatch(threadNum); long startUuid = System.currentTimeMillis(); for (int t = 0; t < threadNum; t++) { new Thread(new Runnable() { public void run() { for (int i = 0; i < countPerThread; i++) { UUID.randomUUID(); } uuidLatch.countDown(); } }).start(); } uuidLatch.await(); long uuidCost = System.currentTimeMillis() - startUuid; System.out.println("UUID 10线程共" + threadNum * countPerThread + "个ID,耗时:" + uuidCost + "ms"); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/16 18:08:14

【2026年西安搬家必看】如何避坑选对搬家公司?关键电话一网打尽!

搬家&#xff0c;对许多人来说是一场“浩劫”。大包小包的行李、笨重的家具、易碎的家电&#xff0c;光是想想就让人头疼。更糟心的是&#xff0c;如果在搬家公司上选择失误&#xff0c;不仅可能遭遇中途加价、物品损坏&#xff0c;还会白白浪费时间和精力。面对市场上琳琅满目…

作者头像 李华
网站建设 2026/5/16 18:06:50

中国科学院大学与上海人工智能实验室联手打造的“排版医生“

这项由中国科学院大学、上海人工智能实验室及上海交通大学联合开展的研究&#xff0c;以预印本形式发布于2026年5月&#xff0c;论文编号为arXiv:2605.10341&#xff0c;感兴趣的读者可通过该编号在arXiv平台查阅完整原文。**研究概要&#xff1a;那个让所有人头疼的"最后…

作者头像 李华
网站建设 2026/5/16 18:06:38

2026年会议纪要工具谁处理最快:5款产品横向对比

作为技术团队的负责人&#xff0c;我每周得参加至少5个跨部门会议。其实开会倒还好&#xff0c;最烦的是会后要花时间整理会议记录——一个60分钟的会议&#xff0c;手动整理通常需要再花1小时。后来&#xff0c;我开始尝试各种语音转文字的工具&#xff0c;才发现处理速度对提…

作者头像 李华
网站建设 2026/5/16 18:01:41

使用HermesAgent框架时接入Taotoken多模型服务的配置指南

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 使用HermesAgent框架时接入Taotoken多模型服务的配置指南 1. 准备工作&#xff1a;获取必要的凭证与信息 在开始配置之前&#xf…

作者头像 李华
网站建设 2026/5/16 18:01:14

对比虚拟机内外通过Taotoken调用同一模型的响应速度差异

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 对比虚拟机内外通过Taotoken调用同一模型的响应速度差异 在部署基于大模型API的应用时&#xff0c;基础设施环境的选择是架构设计的…

作者头像 李华
网站建设 2026/5/16 17:57:48

3分钟拯救你的B站视频:m4s-converter零转码转换完全指南

3分钟拯救你的B站视频&#xff1a;m4s-converter零转码转换完全指南 【免费下载链接】m4s-converter 一个跨平台小工具&#xff0c;将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 想象一下&#xff0c;你花了…

作者头像 李华