生成唯一id的几种方法

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

生成唯一id的几种方法

生成唯一id的方式有很多,UUID,自动增长列,雪花算法,redis等等。

生成id的要求:

全局唯一
趋势递增
效率高(生成.使用.索引)
控制并发

1.雪花算法(twitter 的 snowflake算法)

Snowfake算法是twitter’开源的分布式id生成算法,结果就是long长整型的id

雪花算法又名(SnowFlake)生成id的结果是一个64bit大小的整数。函数图如下:

雪花算法保证:

  1. 所有生成的id按时间趋势递增
  2. 整个分布式系统内不会产生重复id(因为有datacenterId和workerId来做区分)

2.UUID

简介:Uuid是按照开放软件基金会(osf)制定的标准计算
用到了以太网开地址(MAC),纳米级时间,芯片id码和许多可能的数字

组成:

1.当前日期和时间
2.时钟序列
3.全局唯一的ieee机器识别号(如果有网卡,从网卡获取,没有网卡以其他方式获取)
生成长度为36的字符串

优点:
使用简单
不依赖其他组件
不影响数据库拓展
缺点:
数据库索引效率低
太过于无意义.用户不友好
长度36的字符串,空间占用大
应用集群环境,机器多的时候,重复几率大

UUID的一个缺点就是生成的字符串过长。

3.自动增长

mysql自带自增生成id,oracle可以用序列生成id,但在数据库集群环境下,扩展性不好。

Mysql 整型自增索引之所以快是因为mysql 采用b+树对整型进行了加速
Mysql使用auto_increment, oracle使用sequence序列
集群环境下,不同的库,设置不同的初始值,每次自增加 100

Mysql下修改起点和步长的方式
设置起点
Set @@auto_increment_offset=1 // 设置起点为1
设置步长
Set@@auto_increment_increment=100 // 设置步长为100
查看参数
show VARIABLES like ‘auto_%’ // 查看参数

优点:
无需编码
性能也过得去
索引友好
缺点:
大表不能做水平分表,否则插入删除易出现问题(已经存在很大数据的时候再分表,容易出现问题)
依赖前期规划,拓展麻烦
依赖mysql内部维护自增锁,高并发下插入数据影响性能
在业务操作父,子(关联表)插入时,要先父表 后子表

4.Redis

Java 中 基本类型所占的字节
Oracle 产生序列号的方式

思路:

利用增长计数api,业务系统在自增长的基础上,配合其他信息组成一个唯一id
Redis的incr(key) api用于将key的值进行递增,并返回增长数值
如果key不存在,则创建并赋值为0
利用redis的特性: 单线程原子操作,自增计数api,数据有效机制ex

实例:业务编码+地区+自增数值

key的命名规范:系统名:+ 模块:+ 功能: + key 例如: 163:study:order:id

优点:
拓展性强,可以方便的结合业务进行处理
利用redis操作原子性的特征,可以保证在并发的时候不会重复
缺点:
引入redis就意味着引入其他三方依赖
增加一侧网络开销
需要对reids服务实现高可用

【项目实战】分布式系统中如何解决全局唯一ID问题?分布式全局ID神器之雪花算法SnowFlake简介 Java自带的,生成一串唯一随机36位字符串(32个字符串+4个“-”)的算法。它是Twitter开源的由64位整数组成分布式ID百度开源的分布式ID生成器基于雪花算法实现美团开源的分布式ID生成器美团点评分布式ID生成系统。 阅读详情

相关推荐

java语言生成唯一ID的方法

唯一ID(UniqueID)生成算法 解析

本文详细阐述唯一ID生成器算法GuidCombGenerator和SnowflakeGenerator。GuidCombGenerator用于生成字符串UID,SnowflakeGenerator用于生成数值UID。

末小渝的博客 1万+

在Jetson orin板卡上部署ocr模型遇到错误

摘要:安装ONNX Runtime GPU版本时遇到问题,直接pip install onnxruntime-gpu会报错。解决方案是从test.pypi.org下载对应的.whl文件(如ort_nightly-1.14.0...aarch64.whl),本地安装后还需降级NumPy版本(如pip install numpy==1.26),以解决NumPy版本兼容性问题。整个过程涉及三个关键步骤:下载正确架构的wheel文件、本地安装、调整NumPy版本。

xdxd3c的博客 1524

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

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

weixin_65175398的博客 1923

5分钟搞定!用OpenCV实现全景图像柱面展开的保姆级教程(附完整代码)

本文提供了一份使用OpenCV实现全景图像柱面展开的详细教程。通过清晰的数学原理讲解和分步代码演示,指导读者快速掌握从等距柱状投影全景图到平面展开图的核心转换方法,并涵盖性能优化、参数调整及透视视图扩展等实用技巧,适合图像处理爱好者和开发者实践。

sony5的博客 571

生物信息学投稿避坑指南:如何根据影响因子和审稿速度选择最适合的期刊

本文为生物信息学研究者提供全面的期刊投稿策略,重点解析影响因子、审稿速度等关键指标,帮助选择最适合的期刊。涵盖算法开发类和应用型研究的投稿路径,分析不同出版社特点及开放获取的利弊,并提供投稿全流程优化建议,助力高效发表研究成果。

weixin_42652674的博客 378

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

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

qq_36031634的博客 7952

3分钟!教会你用 DeepSeek/Claude3.7+Cursor 快速入门AI编程(喂饭级教程)

3分钟!教会你用 DeepSeek/Claude3.7+Cursor 快速入门AI编程(喂饭级教程)

yizhen91y的博客 4720

php 生成唯一id的几种方法

1.session_create_id(); 是php 7.1新增的函数,用来生成session id,低版本无法使用。 2.

Yuuuuuubs的博客 2689

stm32教程之三重ADC交错采样

ps:本文基于stm32F407ZGT6单片机 stm32F4单片机单通道采集的最大采样率为2.4M,所以有时会难以满足较高频率的采样,于是查阅芯片手册,发现stm32F4支持多重ADC采集,利用每个通道的转换时间,错位采样,从而提高采样率,最大把采样率开到2.4*3=7.2M. (去年初学ADC时研究的,基于cube和HAL库的三重ADC交错采样参考资料不多,我也是研究了一段时间,写下这篇博客希望可以帮助到更多人。) 示意图如下: 以下是官方例子的说明, In this ex...

weixin_52178036的博客 8873

将Dify平台开发的工作流集成到Open WebUI中

将Dify开发的工作流集成到Open WebUI是一个能够显著增强AI应用交互能力和业务逻辑深度的有效途径。其核心在于通过API建立两者间的通信桥梁,并确保API在格式、协议和行为上的一致性,特别是向OpenAI Chat API规范看齐。最简单直接的路径是利用Dify的“对话型”或“Agent型”应用,这类应用的API设计更倾向于满足Open WebUI这类聊天前端的期望。然而,面对复杂的现实场景,直接的完美兼容并非总是唾手可得。

形上得其象,形下合于数;阴阳自济,玄理自明。 2030

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

【系统安全】Windows内核权限提升漏洞(CVE-2024-30088)

CVE-2024-30088是Windows内核提权漏洞,由越南安全研究员@Bùi Quang Hiếu详细分析。漏洞发生在AuthzBasepCopyoutInternalSecurityAttributes函数中,该函数在复制SecurityAttributesList时会使用用户提供的指针,在校验及复制期间存在时间差,导致存在TOCTOU漏洞。

李同學AI安全 1325

php 生成唯一 50,php 生成唯一id的几种解决方法

网上查了下,有很多的方法1、md5(time() . mt_rand(1,1000000));这种方法有一定的概率会出现重复2、php内置函数uniqid()uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID.w3school参考手册有一句话:"由于基于系统时间,通过该函数生成的 ID 不是最佳的。如需生成绝对唯一的 ID,请使用 md5() 函数"。下面方法返回结果类似:5DDB...

weixin_39618597的博客 137

Python爬虫抓取淘宝商品详情页信息:从入门到高级技术应用

通过本篇博客,我们了解了如何使用Python爬虫抓取淘宝商品详情页的信息,如何使用requests和Selenium抓取静态和动态内容,如何应对淘宝的反爬虫机制,如何将抓取的数据保存到CSV文件等。随着爬虫技术的不断发展,开发者可以根据需要选择合适的工具和技术,如使用分布式爬虫框架提高抓取效率,或者利用OCR技术处理验证码等问题。在进行淘宝爬虫时,需要注意遵循相关法律法规和平台的爬虫政策,避免对平台造成过度的负担或侵犯其合法权益。

2201_76125261的博客 460

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

php 生成唯一用户帐号,php 生成唯一id的几种解决方法

网上查了下,有很多的方法1、md5(time() . mt_rand(1,1000000));这种方法有一定的概率会出现重复2、php内置函数uniqid()uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID.w3school参考手册有一句话:"由于基于系统时间,通过该函数生成的 ID 不是最佳的。如需生成绝对唯一的 ID,请使用 md5() 函数"。下面方法返回结果类似:5DDB...

weixin_39983912的博客 520

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

php生成唯一文件名,php 生成唯一id的几种解决方法

网上查了下,有很多的方法1、md5(time() . mt_rand(1,1000000));这种方法有一定的概率会出现重复2、php内置函数uniqid()uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID.w3school参考手册有一句话:"由于基于系统时间,通过该函数生成的 ID 不是最佳的。如需生成绝对唯一的 ID,请使用 md5() 函数"。下面方法返回结果类似:5DDB...

weixin_29421409的博客 915

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

php 生成唯一id的几种解决方法

网上查了下,有很多的方法 1、md5(time() . mt_rand(1,1000000));   这种方法有一定的概率会出现重复 2、php内置函数uniqid()   uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID.   w3school参考手册有一句话:"由于基于系统时间,通过该函数生成的 ID 不是最佳的。如需生成绝对唯一的 ID,请使用 md5() 函数"

草根上的须子 1111

用户 ID 生成唯一邀请码的几种方法

文章目录1.需求描述2.需求分析3.字符集4.方法一:Hash + 唯一性判断(不可逆)4.方法二:除法取整与取模(可逆)5.方法三:除法取整与取模 + 扩散、混淆(可逆)6.小结参考文献 1.需求描述 有一个业务需求,需要根据用户 ID(数值型 >=10000000)生成一个唯一的长 6 个字符的邀请码,用于邀请新用户注册。 2.需求分析 从业务需求和一般产品邀请码的使用体验上来看,邀请码有以下几个特点: 不可重复:不用用户 ID 生成的邀请码是不同的; 唯一确定:一个用户 ID 只能生成一个邀请

Doublelv 的博客专栏。 1万+

php 生成唯一id的几种解决方法(实例)

php 生成唯一id的几种解决方法(实例)

w36680130的博客 198

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

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

IT小辉同学 6537

PHP生成唯一ID的几种方法

1:MD5加密(有一定概率出现重复)(例:2995cdd038beb76145b675a7cef2b994) md5(time().mt_rand(1,1000000)) 2:uniqid()函数(由于基于系统时间,通过该函数生成的 ID 不是最佳的。如需生成绝对唯一的 ID,请使用 md5() 函数配合使用)(例:6083a5d06c64d) 3:session_create_id()函数(PHP 7.1新增函数)重复率较低,一般情况下可使用(例:j8emn2fn64dgk847o7m0b42nd

nuomai 953

python生成唯一Id的几种方法

# coding:utf-8 import random def createRandomString(len): print ('wet'.center(10,'*')) raw = "" range1 = range(58, 65) # between 0~9 and A~Z range2 = range(91, 97) # between A~Z and a~...

桜 2万+
上一篇: Java中的File I O
下一篇: Java获取自定义时间的上个月当天计算方法
Clsrm
博客等级 码龄7年 47粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值