当前位置: 首页 > news >正文

后端:唯一ID有哪些生成方式

文章目录

  • 在后端开发中的ID生成策略
    • 1. 数字型 ID
      • 特点:
      • 优点:
      • 缺点:
      • 例子:
      • 常见用法:
    • 2. UUID(通用唯一标识符)
      • 特点:
      • 优点:
      • 缺点:
      • 例子:
      • 常见用法:
    • 3. 雪花算法(Snowflake ID)
      • 特点:
      • 优点:
      • 缺点:
      • 例子:
      • 常见用法:
    • 4. 自定义格式的 ID
      • 特点:
      • 例子:
      • 优点:
      • 缺点:
    • 不同类型 ID 的选择依据

在后端开发中的ID生成策略

在后端开发中,用户的ID或一条记录的ID通常称为主键(Primary Key),其格式和生成方式取决于系统的需求、设计和数据库类型。以下是常见的几种ID生成方案:

在这里插入图片描述

1. 数字型 ID

特点:

  • 纯数字的ID,通常为整数(intbigint等)。
  • 关系型数据库(如 MySQL、PostgreSQL)默认使用**自增(Auto Increment)**整数作为主键。
  • 适合简单系统或需要高效存储的场景。

优点:

  • 简单易用:便于排序、检索和存储。
  • 节省存储空间:数字占用的存储空间较小。

缺点:

  • 不安全:自增ID容易被猜测,暴露系统中的记录数和顺序。
  • 分布式环境下难处理:自增ID在多个服务或数据库节点之间可能冲突。

例子:

id
1
2
3

常见用法:

@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)  // 自增IDprivate Long id;
}

2. UUID(通用唯一标识符)

特点:

  • UUID 是128位标识符,通常表现为32个字符长的十六进制数字,格式为 8-4-4-4-12
  • UUID 是全局唯一的,不依赖数据库自增机制,适合分布式系统和跨服务的标识。

优点:

  • 全球唯一性:在分布式系统中几乎不可能重复。
  • 安全性更强:无法轻易猜测下一个ID,适合公开暴露的场景。

缺点:

  • 存储开销大:UUID占用较多存储空间(16字节)。
  • 性能较差:UUID作为主键进行排序和查询时,性能较低。

例子:

550e8400-e29b-41d4-a716-446655440000

常见用法:

import java.util.UUID;
import javax.persistence.*;@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.AUTO)private UUID id;
}

或使用 Hibernate 的 UUID 生成器:

@Id
@org.hibernate.annotations.GenericGenerator(name = "uuid", strategy = "uuid2")
@GeneratedValue(generator = "uuid")
@Column(name = "id", updatable = false, nullable = false)
private UUID id;

3. 雪花算法(Snowflake ID)

特点:

  • 雪花算法生成的ID通常是一个64位的长整型数字,格式为时间戳 + 机器ID + 序列号
  • ID 依赖当前时间,可以保证在分布式环境中的唯一性。

优点:

  • 高性能:在分布式环境中,可以高效生成唯一的ID。
  • 排序性能好:ID基于时间戳生成,因此是有序的。

缺点:

  • 依赖时间:如果服务器时间不同步,可能会生成重复的ID。

例子:

715972992927380480

常见用法:

public class SnowflakeIdGenerator {private static final Snowflake snowflake = new Snowflake();public static long generateId() {return snowflake.nextId();}
}

4. 自定义格式的 ID

特点:

  • 有时系统需要自定义格式的ID,可能包含日期、业务相关的信息等。这类ID通常通过字符串拼接生成。

例子:

USER-20231012-001

优点:

  • 可读性好:可以通过ID看出一些业务信息,比如日期、类别等。

缺点:

  • 复杂度高:生成规则需要自定义,可能增加管理复杂度。
  • 冲突风险:生成逻辑不严谨可能会导致ID冲突。

不同类型 ID 的选择依据

  • 数字型 ID: 适合简单的系统,不需要分布式唯一性或不需要公开暴露ID的场景。
  • UUID: 适合分布式系统,跨服务、跨数据库的全局唯一标识,适合API公开场景。
  • 雪花算法 ID: 适合高并发、分布式系统,尤其适合需要排序的场景,如日志、时间戳排序等。
  • 自定义 ID: 适合业务场景,通常用于订单编号、用户编号等特定需求。

相关文章:

后端:唯一ID有哪些生成方式

文章目录 在后端开发中的ID生成策略1. 数字型 ID特点:优点:缺点:例子:常见用法: 2. UUID(通用唯一标识符)特点:优点:缺点:例子:常见用法&#xff…...

LabVIEW提高开发效率技巧----高精度延时

在LabVIEW开发中,时间控制是许多应用中的关键环节,尤其是高精度应用中,时钟漂移会严重影响程序的准确性。为此,使用Wait Until Next ms Multiple来代替简单的Wait (ms),可以显著减少时钟漂移,确保高精度延时…...

<Link><Link> 和 <a> </a>标签的区别

1. Link (React Router): 作用: Link 是 react-router-dom 提供的组件,用于在 React 应用中创建前端路由跳转。它不会导致页面重新加载。优点: 无刷新跳转: 使用 Link 进行导航时,React 的路由器会捕获并处理链接,避免浏览器的全…...

靶场战神为何会陨落?

我从第一个SQL注入漏洞原理学起,从sql-libas到DVWA,到pikachu再到breach系列,DC系列靶场,再到实战挖洞,发现靶场与实战的区别是极其大的。 我个人觉得在这种web环境下,难的不是怎么测一个漏洞点,而是怎么找一个漏洞点。靶场与实战最大的区别在于你不知道这个地方到底有没有漏洞…...

rpm 命令

rpm(Red Hat Package Manager)是 Red Hat Linux 及其衍生发行版(如 CentOS、Fedora)中用于管理软件包的系统。它允许用户安装、卸载、升级、查询和验证软件包。 一、安装软件包 (1)安装一个 RPM 软件包&a…...

录微课专用提词器,不会被录进视频中的提词器,还能显示PPT中备注的内容

不坑提词器,全称:不坑隐形提词器。是一款能够在截图、录屏、直播过程中隐藏界面的提词器软件。 系统要求:Win10 1024 以上(特别提醒:Win7状态下不可隐身) ⏬下载 提词器默认放在不坑盒子的安装目录下&…...

Ansible概述

目录 一、ansible简介 二、absible的特点 三、ansible的工作原理以及流程 四、ansible环境安装部署 五、ansible命令行模块 六、inventory 主机清单 一、ansible简介 Ansible是一个基于Python开发的配置管理和应用部署工具,现在也在自动化管理领域大放异彩。…...

NTC 温度电阻计算方式

100K温度值列表 https://wenku.baidu.com/view/59565cba1a37f111f1855b38?aggId989bc39968d97f192279168884868762cbaebb44&frcatalogMain_text_ernie_recall_feed_index%3Awk_recommend_main1&wkts1729568234531&bdQuery100K%E6%B8%A9%E5%BA%A6%E7%94%B5%E9%98%B…...

Qt中自定义qDebug打印信息的宏(文件名,行数,函数名,日期,时间等前缀)并取消打印

使用qDebug()打印信息时&#xff0c;默认打印"<<"符号后面的信息。 通过自定义宏&#xff0c;可以额外打印文件名&#xff0c;行数&#xff0c;函数&#xff0c;日期、时间等前缀&#xff0c;方便快速定位调式信息的位置。 同时&#xff0c;可以定义宏取消打…...

【基于docker的深度学习训练环境】关键步骤记录

最近给公司搭建了一个小型的深度学习环境&#xff0c;实现了多人通过SSH对GPU资源的利用&#xff0c;下面对一些关键架构和易用性部分进行记录。 一、整体软硬件框架 1、硬件配置&#xff0c;采用的双GPU的方案&#xff0c;两块消费级显卡。 2、应用层架构 宿主机系统为ubunt…...

管理、情商、格局-冯唐讲资质通鉴-笔记

一、CEO职责 制定制度、维护制度&#xff0c;制度即礼&#xff0c;礼崩乐坏&#xff0c;万万不能制定战略找钱、找人 二、汇报线 不能向上越级汇报不能向上越级管理 三、领导 领导出错的情况&#xff0c;依然要服从领导的安排&#xff0c;领导的错轮不到我们来处理干预&am…...

摇人摇人, JD内推岗位(社招+校招)

摇人摇人, 有找工作的家人们看过来啊~ 虚位以待, 快到碗里来 算法开发工程师岗 京东云 北京|T7, 5-10年 岗位职责&#xff1a; 参与基于RAG知识库平台和ChatBI产品打造和商业化落地&#xff0c;进行相关技术&#xff1a;包括OCR、文档拆分、意图理解、多轮对话、NL2SQL、Embed…...

振弦式传感器在高边坡监测中发挥哪些优势?

振弦式传感器在高边坡监测中发挥哪些优势?在工程建设与地质灾害防治领域&#xff0c;高边坡监测至关重要。高边坡的稳定性直接关系到工程的安全以及周边环境和人员的生命财产安全。为了实现对高边坡的有效监测&#xff0c;各种先进的传感器技术被广泛应用&#xff0c;其中振弦…...

计算机网络基础进阶

三次握手四次挥手 三次握手 1------建立连接----------------------2 ACK1&#xff0c;seq0 2------传输数据&#xff0c;建立连接---------1 1------传输数据&#xff0c;建立连接---------2 三次握手用于建立TCP连接&#xff0c;确保通信双方都准备好进行数据传输。整个…...

什么是“钻石继承问题”

钻石继承问题&#xff08;Diamond Inheritance Problem&#xff09; 主要是指在多重继承中&#xff0c;由于继承关系的复杂性&#xff0c;子类可能通过多个路径继承到相同的基类&#xff0c;从而导致成员的多份副本或者方法调用的二义性。 C 通过 虚拟继承 来解决这个问题&…...

iOS 回到主线程刷新UI

在iOS 里面,项目打开就会运行一个主线程,所有的UI都在主线程里进行.其他网络请求或者耗时操作理论上也可以在主线程运行,但是如果太耗时,那么就会影响主线程其他UI.所以需要开字线程来进行耗时操作,子线程进行完耗时操作之后,如果项目需求有需要刷新UI,或者改变UI,一定得回到主…...

Spring Data 技术详解与最佳实践

引言 Spring Data 是 Spring 框架的一个模块&#xff0c;旨在简化数据访问层的开发。它提供了一种通用的方法来访问各种数据存储&#xff0c;包括关系型数据库、NoSQL 数据库、搜索引擎等。Spring Data 不仅简化了数据访问代码的编写&#xff0c;还提供了一系列强大的特性&…...

ubuntu下安装图片编辑工具shutter

ubuntu自带的截屏工具能够截图指定区域的图片&#xff0c;但是通常情况下&#xff0c;我们还需要对图片做一些编辑例如&#xff0c;下划线&#xff0c;方框标识&#xff0c;添加文本描述等&#xff0c;这时就需要强大的shutter软件了。 有人说直接在终端直接执行命令安装即可&…...

代码随想录算法训练营Day38 | 62. 不同路径、63. 不同路径 II

目录 62. 不同路径 63. 不同路径 II 62. 不同路径 题目 62. 不同路径 - 力扣&#xff08;LeetCode&#xff09; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到…...

TrickMo 安卓银行木马新变种利用虚假锁屏窃取密码

近期&#xff0c;研究人员在野外发现了 TrickMo Android 银行木马的 40 个新变种&#xff0c;它们与 16 个下载器和 22 个不同的命令和控制&#xff08;C2&#xff09;基础设施相关联&#xff0c;具有旨在窃取 Android 密码的新功能。 Zimperium 和 Cleafy 均报道了此消息。 …...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...