生成唯一ID的常用方法与技术应用

生成唯一ID的作用?有哪些方式方法? UUID是一种128位的全局唯一标识符,通常以32位的十六进制字符表示。UUID的生成不依赖于中央控制机构,因此可以在分布式系统中确保唯一性。 阅读详情

Alt

🎈个人主页:程序员 小侯
🎐优快云新晋作者
🎉欢迎 👍点赞✍评论⭐收藏
✨收录专栏:Java学习
✨文章内容:唯一ID
🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗

在软件开发中,生成唯一ID是一个常见的需求,特别是在分布式系统和数据库中。唯一ID的生成涉及到多方面的考虑,包括性能、分布式环境下的唯一性、趋势递增等方面。本文将探讨一些常用的生成唯一ID的方法和技术应用,并提供相应的代码示例。
在这里插入图片描述

1. UUID(Universally Unique Identifier)

UUID是一种由标准化的128位大小的值所生成的标识符,通常表示为32个十六进制数字,以连字符分隔。UUID的生成是基于当前时间、计算机的MAC地址和随机数等因素,因此具有足够的唯一性。但是,由于其长度较长,不适合作为数据库表的主键。

代码示例:

import java.util.UUID;

public class UUIDGenerator {

    public static String generateUUID() {
        return UUID.randomUUID().toString();
    }

    public static void main(String[] args) {
        System.out.println(generateUUID());
    }
}

2. 数据库自增主键

数据库自增主键是一种常见的生成唯一ID的方式,通常用于关系型数据库表的主键。数据库会自动为每条记录分配一个唯一的、递增的ID。

代码示例(使用MySQL的自增主键):

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255)
);

在使用时,插入数据时无需指定ID:

INSERT INTO users (name) VALUES ('John Doe');

3. 雪花算法(Snowflake Algorithm)

雪花算法是Twitter开源的分布式ID生成算法,可以在分布式系统中生成全局唯一的ID。它的结构如下:

 0  41位时间戳 |  10位节点ID  | 12位序列号

代码示例:

public class SnowflakeIdGenerator {

    private final long epoch = 1609459200000L; // 2021-01-01 00:00:00
    private final long workerIdBits = 10L;
    private final long sequenceBits = 12L;

    private long workerId;
    private long sequence = 0L;
    private long lastTimestamp = -1L;

    public SnowflakeIdGenerator(long workerId) {
        if (workerId < 0 || workerId >= (1L << workerIdBits)) {
            throw new IllegalArgumentException("Worker ID must be between 0 and " + ((1L << workerIdBits) - 1));
        }
        this.workerId = workerId;
    }

    public synchronized long generateId() {
        long timestamp = System.currentTimeMillis();

        if (timestamp < lastTimestamp) {
            throw new RuntimeException("Clock moved backwards. Refusing to generate ID for " + (lastTimestamp - timestamp) + " milliseconds");
        }

        if (timestamp == lastTimestamp) {
            sequence = (sequence + 1) & ((1L << sequenceBits) - 1);
            if (sequence == 0) {
                // Sequence overflow, wait for next millisecond
                timestamp = tilNextMillis(lastTimestamp);
            }
        } else {
            sequence = 0L;
        }

        lastTimestamp = timestamp;

        return ((timestamp - epoch) << (workerIdBits + sequenceBits))
                | (workerId << sequenceBits)
                | sequence;
    }

    private long tilNextMillis(long lastTimestamp) {
        long timestamp = System.currentTimeMillis();
        while (timestamp <= lastTimestamp) {
            timestamp = System.currentTimeMillis();
        }
        return timestamp;
    }

    public static void main(String[] args) {
        SnowflakeIdGenerator idGenerator = new SnowflakeIdGenerator(1);

        // Generate 5 IDs
        for (int i = 0; i < 5; i++) {
            System.out.println(idGenerator.generateId());
        }
    }
}

4. 使用数据库分布式ID生成器

一些数据库提供了分布式ID生成器,例如MySQL的auto_increment和PostgreSQL的serial。这些数据库可以在分布式环境中生成唯一ID。

代码示例:

-- MySQL的auto_increment
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255)
);

-- PostgreSQL的serial
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255)
);

5. 结语

在选择生成唯一ID的方法时,需要根据具体的业务场景和需求进行选择。UUID适用于不依赖于数据库的独立系统,数据库自增主键适用于关系型数据库,雪花算法适用于分布式系统,而数据库分布式ID生成器适用于特定数据库环境。在实际应用中,也可以根据需要结合多种方法来满足业务需求。

后记 👉👉💕💕美好的一天,到此结束,下次继续努力!欲知后续,请看下回分解,写作不易,感谢大家的支持!! 🌹🌹🌹

唯一ID生成算法剖析 引在业务开发中,大量场景需要唯一ID来进行标识:用户需要唯一身份标识;商品需要唯一标识;消息需要唯一标识;事件需要唯一标识…等等,都需要全局唯一ID,尤其是分布式场景下。... 阅读详情

相关推荐

MySql唯一ID生成

前阵子,一直在折腾阿里云。写的一些文章也放到自己的wordpress博客上了。但自己前阵子在做系统更换操作的时候未备份磁盘,大部分心血付诸东流。真是一个悲伤的故事。现在决定用.NET搞搞自己的博客。正好把wordpress给抛弃掉。 言归正传,这个唯一号类似自增ID,自增id虽然好用,但进行数据库切换(SQL换Mysql等等)的时候,参与具体业务逻辑的这个东西说不定就是一个定时炸弹。但如

shenge321的专栏 1万+

生成唯一id的几种方法

生成唯一id的几种方法 生成唯一id的方式有很多,UUID,自动增长列,雪花算法,redis等等。 生成id的要求: 全局唯一 趋势递增 效率高(生成.使用.索引) 控制并发 1.雪花算法(twitter 的 snowflake算法) Snowfake算法是twitter’开源的分布式id生成算法,结果就是long长整型的id 雪花算法又名(SnowFlake)生成id的结果是一个64bit大小的整数。函数图如下: 雪花算法保证: 所有生成的id按时间趋势递增 整个分布式系统内不会产生重复id(因为有

Clsrm的博客 6788

游戏后台生成唯一ID

MMO游戏后台生成唯一ID   MMO游戏后台通常需要由大量服务器来共同承载海量玩家,虽然玩家可能分布在不同的游戏大区,但是他们可能会通过跨服等等方式进行各种交互。游戏中的角色,装备,物品等需要生成一个全局唯一ID标识,便于辨别不同玩家,不同装备,也方便定位外网问题。   常见的分布式全局唯一ID生成方式包括使用数据库自增,使用Redis的原子操作INCR和INCRBY,使用UUID,SnowFl...

weixin_29869121的博客 1844

唯一ID如何生成,介绍一下目前技术领域最常使用的几种方法

纵使十面大山,又如何,无妨......

IT小辉同学 6535

【项目实战】分布式系统中如何解决全局唯一ID问题?分布式全局ID神器之雪花算法SnowFlake简介

Java自带的,生成一串唯一随机36位字符串(32个字符串+4个“-”)的算法。它是Twitter开源的由64位整数组成分布式ID百度开源的分布式ID生成器基于雪花算法实现美团开源的分布式ID生成器美团点评分布式ID生成系统。

奶爸的编程之路,也就一周冷个三天 3543

SRRC型号核准的模块豁免规则解析——如何利用完整型模块简化设备认证流程

本文详细解析了SRRC型号核准中模块豁免规则的应用,重点介绍了完整型模块的技术定义、豁免条件及实际应用场景。通过合理利用完整型模块,企业可显著简化设备认证流程,缩短上市周期并降低成本。文章还提供了模块选型指南和常见问题解决方案,帮助工程师高效应对SRRC认证挑战。

weixin_29306011的博客 930

如何生成唯一ID:探讨常用方法与技术应用

不同的场景可能需要不同的唯一ID生成方法。UUID适用于简单场景,数据库自增ID适用于单数据库系统,而Snowflake算法则适用于分布式系统。数据库全局唯一ID则是一种简便的生成方式,但可能不适合所有需求。在选择唯一ID生成方法时,需要根据具体的业务需求、系统架构和性能要求做出权衡。综合考虑生成效率、递增有序性、唯一性等方面的因素,选择合适的唯一ID生成策略,以确保系统的稳定性和可维护性。😊🙏Java面试技巧Java面试八股文 - 掌握面试必备知识(目录篇)Java学习路线。

学IT,找陈寒 3177

科研笔记:怎样写好博士论文?

博士论文外审避坑指南与写作要点 博士论文外审的核心关注点呈现5级优先级:科研成果(硬指标)>创新性>逻辑结构与场景合理性>文献综述与规范性>工作量验证。外审专家会重点核查:1)成果清单是否达标;2)创新点是否真实明确;3)章节逻辑是否自洽、应用场景是否细化;4)文献综述是否构建"研究坐标系";5)实验/理论支撑是否充分。需特别注意三大雷区:科学错误(直接挂稿)、伪创新、场景不合理。写作时应强化选题依据的场景细化,通过"发展阶段+跨领域对比"提升文献综述质量。

Grow into a more wonderful you 1063

Java中生成唯一ID的方法

有时我们不依赖于数据库中自动递增的字段产生唯一ID,比如多表同一字段需要统一一个唯一ID,这时就需要用程序来生成一个唯一的全局ID。 UUID 从Java 5开始, UUID 类提供了一种生成唯一ID的简单方法。UUID是通用唯一识别码 (Universally Unique Identifier)的缩写,UUID来源于OSF(Open Software Foundation,开源软件基金会)的D...

王浩的技术博客 2万+

浅谈天线 - - - GNSS/BT/4G/2.4G

全球定位导航系统,最成熟的就是美利坚,我大中华,俄罗斯,还有就是欧洲的一个(太次不谈)所以我们在项目调试的时候,小尺寸的陶瓷天线上一般兼容2个频段,体积大一点的可以兼容三个频段,采用组合的形式 GPS+BD GPS+GLONASS GLONASS+BD 或者是单频段的定位天线陶瓷PATC陶瓷片:陶瓷片面积越大,介电常数越大,其共振频率越高,接收效果越高,这就是为什么都推荐使用大一点的陶瓷天线的原因银层:陶瓷天线表面的银层可以影响天线的共振频率,理想的GNSS陶瓷片频点准确落在1575.42MH

BLACKHOLE6的博客 1万+

【深大算法设计与分析】实验六 最大流应用问题(棒球赛问题) 实验报告 附代码、数据集

【内附代码与数据集】【深大算法设计与分析】实验六 最大流应用问题(棒球赛问题)

m0_74268508的博客 1292

【SpringBoot篇】基于Redis实现生成全局唯一ID的方法

科技的发展改变着世界,而我们作为技术人员,也在这个过程中书写着自己的篇章。总之,生成全局唯一ID有助于提高系统的可用性、数据的完整性和安全性,同时也方便数据的管理和分析。总结来说,生成全局唯一ID有助于确保数据的唯一性、提高系统的可用性和性能,并支持数据跟踪、安全性和权限控制等功能。然后,使用位运算符 | 进行按位或操作,将左移后的时间戳与序列号 count 进行按位或操作,合并它们的二进制表示。最终得到的结果就是一个64位的ID,其中高位是时间戳部分,低位是序列号部分。ID生成器的算法如下。

小吉妙妙屋 1万+

HBase学习二:RegionServer详解

RegionServer是HBase系统中最核心的组件,主要负责用户数据写入、读取等基础操作。RegionServer组件实际上是一个综合体系,包含多个各司其职的核心模块:HLog、MemStore、HFile以及BlockCache。一个RegionServer由一个(或多个)HLog、一个BlockCache以及多个Region组成。其中,HLog用来保证数据写入的可靠性;BlockCache可以将数据块缓存在内存中以提升数据读取性能;

qwerty1372431588的博客 746

雪花算法生成全局唯一ID

传统的生成ID的方法有以下几个: Java的UUID mysql的自增主键 利用Redis的INCR 以上方法都存在一定的问题。 UUID生成的是以下一串36位的16进制数 6d62ff8c-66d3-43e1-8009-44fec60d3b30 但是用UUID当主键的话存在一定问题,首先,它是无序的,因为mysql主键都会自动生成唯一索引,如果主键无序的话,插入一条数据维护索引的代价会很...

weixin_44455476的博客 2万+

什么是 PD 电压诱骗?

电压诱骗” 的意思就是,使用某些方法让 PD 充电器误以为设备需要更高的电压,从而让充电器提供比实际需要更高的电压。手机可能只需要 5V,但笔记本电脑可能需要 20V,通过 PD 协议,充电器能够根据设备的需求输出合适的电压和电流。在“电压诱骗”的情况下,你通过某种手段让充电器以为设备需要 12V,于是充电器会按照这个伪造的请求输出 12V,而不是默认的 5V。充电器评估自己的能力,如果可以提供设备需要的电压和电流,它会调整输出电压,从默认的 5V 切换到设备请求的电压(如 12V)。

qq_45430571的博客 2657

ros_gz_bridge__镜像__readme

Run。

1112

生成全局唯一ID的几种方法

版权声明:本文为博主原创文章,未经博主允许不转载 1.自定义生成规则 eg: 3位服务器编码+15位年月日时分秒毫秒+3位表编码+4位随机码 (这样就完全单机完成编码任务)---共25位 3位服务器编码+15位年月日时分秒毫秒+3位表编码+4流水码 (这样流水码就需要结合数据库和缓存)---共25位 2.单独开一个数据库,获取全局唯一的自增序列或个

qq_36031634的博客 7952

YOLO26创新改进 | 全网独家创新篇、小目标检测专属 | AAAI 2025 | 引入HS-FPN中的HFP和SDP创新点,从频域增强小目标特征,淘汰FPN进行升级,助力YOLO26有效涨点

本文提出HS-FPN特征金字塔网络,通过高频感知模块(HFP)和空间依赖感知模块(SDP)优化YOLO26模型。HFP利用高通滤波器增强小目标的高频特征,SDP捕获相邻像素的空间依赖关系。在AI-TOD等小目标检测数据集上,HS-FPN相比传统FPN显著提升性能。文章详细介绍了HFP和SDP的模块结构、核心代码实现,以及如何在YOLO26中集成这两个模块的配置方法,提供了多个版本的yaml文件配置方案。实验结果表明该方法能有效改善微小目标检测效果。

Ai缝合怪、助力小伙伴高效发论文 205

C++常用的生成唯一id的方法

在开发中,生成唯一的标识符(ID)是一个非常常见的需求。无论是为数据库中的记录分配ID、生成用户会话ID、为分布式系统生成唯一标识,还是在多线程程序中创建锁等对象的唯一标识,唯一ID的生成都是一个关键问题。在C++中,生成唯一ID的方式有很多种,每种方法都根据不同的需求有其独特的优缺点。让我们一起看看C++中几种常用的生成...

cnzzs的博客 997

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

全局唯一id生成策略

全局唯一 ID(GUID/UUID)是许多系统开发中需要解决的问题,尤其是在分布式系统中,必须保证生成的 ID 不重复且高效。

2401_84208906的博客 3475

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Python生成唯一ID的四种办法 程序员必备

我们在实际编程过程中会经常遇到需要用唯一ID的场合,这些唯一ID还会存到数据库中以便于我们将来进行查询。 例如用户编号、订单编号、客户编号等等,几乎凡是需要用来严格划分用户数据归属性的地方就需要用到唯一ID,否则A的数据到了B那,数据乱了整个系统也就算是毁了。 那么唯一ID该如何有效的生成就变成了一门学问了。 今天我们来讲讲在Python里生成唯一ID的几种方式,包括但不限于以下4种。 1.UUI...

Python最详细教程 3万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

JS几种生成唯一id的方法

在开发中偶尔会遇到需要生成唯一id的时候,比如对数组的任意一项进行多次增删改,这时就需要给每一项添加唯一标识符来加以区分。以下便是从网络中搜集而来的各种生成唯一标识的方法,在此总结以供以后查阅。 方法1 function uuid() { var s = []; var hexDigits = "0123456789abcdef"; for (var i = 0; i < 36; i++) { s[i] = hexDigits.substr(Math.

hahahhahahahha123456的博客 4059

redis实现全局唯一ID,全局唯一ID生成器

Redis全局唯一ID生成器是一种基于Redis实现的唯一标识符(UID)生成方案。它通过利用Redis的高性能、高可用性以及数据持久化特性,为分布式系统中的各个节点提供一个唯一的、递增的ID值。 在Redis全局唯一ID生成器中,通常采用以下步骤来生成唯一ID: 获取当前时间戳:使用高精度时钟获取当前时间的时间戳,作为ID的一部分,可以确保唯一性。 获取Redis中的序列号:通过Redis的INCR命令,对一个特定的键进行自增操作,获取一个递增的序列号。 拼接ID:将时间戳和序列号进行拼接,得到唯一ID

weixin_64537269的博客 2292

【SpringBoot中MySQL生成唯一ID的常见方法】

在Spring Boot中,为MySQL生成唯一ID有多种方式,每种方式都有其特定的概念、优越点和使用场景。

L-Blog 1451

java 唯一id生成算法_唯一ID生成算法剖析

在业务开发中,大量场景需要唯一ID来进行标识:用户需要唯一身份标识;商品需要唯一标识;消息需要唯一标识;事件需要唯一标识…等等,都需要全局唯一ID,尤其是分布式场景下。唯一ID有哪些特性或者说要求呢?按照我的分析有以下特性:唯一性:生成的ID全局唯一,在特定范围内冲突概率极小有序性:生成的ID按某种规则有序,便于数据库插入及排序可用性:可保证高并发下的可用性自主性:分布式环境下不依赖中心认证即可自...

weixin_39707536的博客 2110
上一篇: Spring Boot整合 EasyExcel 实现复杂 Excel 表格的导入与导出功能
下一篇: Spring Boot整合Spring Security:构建安全的Web应用
程序员 小侯
博客等级 码龄5年 867粉丝 108原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员 小侯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值