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

Java雪花算法

以下是用Java实现的雪花算法代码示例,包含详细注释和异常处理:

代码下面有解析

public class SnowflakeIdGenerator {// 起始时间戳(2020-01-01 00:00:00)private static final long START_TIMESTAMP = 1577836800000L;// 各部分的位数private static final long DATA_CENTER_ID_BITS = 5L;  // 数据中心ID占5位private static final long WORKER_ID_BITS = 5L;       // 工作节点ID占5位private static final long SEQUENCE_BITS = 12L;       // 序列号占12位// 最大值计算(位运算)private static final long MAX_DATA_CENTER_ID = ~(-1L << DATA_CENTER_ID_BITS);private static final long MAX_WORKER_ID = ~(-1L << WORKER_ID_BITS);private static final long MAX_SEQUENCE = ~(-1L << SEQUENCE_BITS);// 左移位数private static final long WORKER_ID_SHIFT = SEQUENCE_BITS;private static final long DATA_CENTER_ID_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS;private static final long TIMESTAMP_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS + DATA_CENTER_ID_BITS;private final long dataCenterId;  // 数据中心IDprivate final long workerId;      // 工作节点IDprivate long sequence = 0L;       // 序列号private long lastTimestamp = -1L; // 上次生成时间/*** 构造函数* @param dataCenterId 数据中心ID (0~31)* @param workerId     工作节点ID (0~31)*/public SnowflakeIdGenerator(long dataCenterId, long workerId) {if (dataCenterId > MAX_DATA_CENTER_ID || dataCenterId < 0) {throw new IllegalArgumentException("DataCenter ID 超出范围");}if (workerId > MAX_WORKER_ID || workerId < 0) {throw new IllegalArgumentException("Worker ID 超出范围");}this.dataCenterId = dataCenterId;this.workerId = workerId;}/*** 生成下一个ID(线程安全)*/public synchronized long nextId() {long currentTimestamp = System.currentTimeMillis();// 时钟回拨检查if (currentTimestamp < lastTimestamp) {throw new RuntimeException("时钟回拨,拒绝生成ID");}if (currentTimestamp == lastTimestamp) {// 同一毫秒内序列号递增sequence = (sequence + 1) & MAX_SEQUENCE;if (sequence == 0) {// 当前毫秒序列号用完,等待下一毫秒currentTimestamp = waitNextMillis(lastTimestamp);}} else {// 新毫秒重置序列号sequence = 0L;}lastTimestamp = currentTimestamp;// 组合各部分生成IDreturn ((currentTimestamp - START_TIMESTAMP) << TIMESTAMP_SHIFT)| (dataCenterId << DATA_CENTER_ID_SHIFT)| (workerId << WORKER_ID_SHIFT)| sequence;}/*** 阻塞等待直到下一毫秒*/private long waitNextMillis(long lastTimestamp) {long currentTimestamp = System.currentTimeMillis();while (currentTimestamp <= lastTimestamp) {currentTimestamp = System.currentTimeMillis();}return currentTimestamp;}public static void main(String[] args) {// 示例用法SnowflakeIdGenerator idGenerator = new SnowflakeIdGenerator(1, 1);for (int i = 0; i < 10; i++) {System.out.println("生成的ID: " + idGenerator.nextId());}}
}

好的!我来用更简单的方式分步讲解雪花算法的分布式核心逻辑,以及Java代码的关键部分。


第一步:为什么需要分布式ID?

在单机系统中,可以用数据库自增ID。但在分布式系统中,多个节点同时生成ID时,自增ID会冲突。雪花算法通过结构划分,让每个节点独立生成全局唯一ID


第二步:雪花ID的结构(64位)

想象把64位的数字分成四个部分,像切蛋糕一样:

  1. 符号位(1位):固定为0,保证ID是正数(蛋糕边角料,几乎不用管)。
  2. 时间戳(41位):记录ID生成的时间(精确到毫秒),保证ID随时间递增。
  3. 机器ID(10位):分配给不同机器的编号,确保不同机器的ID不冲突。
  4. 序列号(12位):同一毫秒内,如果生成多个ID,用序列号区分。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


第三步:机器ID的分配(分布式核心)

问题:如果多台机器生成ID,如何确保它们的ID不重复?
解决方案:为每台机器分配一个唯一编号(比如:数据中心ID + 工作节点ID)。
示例:5位数据中心ID(031) + 5位工作节点ID(031) → 最多支持 32×32=1024 台机器。
分配方式:手动配置或通过ZooKeeper等工具动态分配。


第四步:Java代码关键点拆解

1. 定义各部分的位数
private static final long DATA_CENTER_ID_BITS = 5L;  // 数据中心ID占5位
private static final long WORKER_ID_BITS = 5L;       // 工作节点ID占5位
private static final long SEQUENCE_BITS = 12L;       // 序列号占12位
2. 计算最大值(防止溢出)
// 5位最大值是 2^5-1 = 31
private static final long MAX_DATA_CENTER_ID = ~(-1L << DATA_CENTER_ID_BITS);
private static final long MAX_WORKER_ID = ~(-1L << WORKER_ID_BITS);
3. 生成ID的核心逻辑
public synchronized long nextId() {long currentTimestamp = System.currentTimeMillis();// 1. 检查时钟回拨(时间不能倒流)if (currentTimestamp < lastTimestamp) {throw new RuntimeException("时钟回拨!");}// 2. 同一毫秒内生成多个IDif (currentTimestamp == lastTimestamp) {sequence++; // 序列号+1if (sequence > MAX_SEQUENCE) {// 当前毫秒的序列号用完了,等待下一毫秒currentTimestamp = waitNextMillis(lastTimestamp);sequence = 0;}} else {sequence = 0; // 新的一毫秒,序列号重置}lastTimestamp = currentTimestamp;// 3. 拼接各部分(位运算)return (时间戳部分) | (机器ID部分) | (序列号部分);
}
4. 位运算如何拼接?

假设时间差是 1000ms,数据中心ID=1,工作节点ID=1,序列号=0:

时间戳部分:1000ms << 22位(左移后占据高位)
机器ID部分:1 << 17位(左移后占据中间)
工作节点部分:1 << 12位(左移后占据中间)
序列号部分:0(占据最后12位)最终二进制:
0000000000000000000000011111101000 00001 00001 000000000000

第五步:分布式场景示例

机器A:数据中心ID=1,工作节点ID=1
机器B:数据中心ID=1,工作节点ID=2
机器C:数据中心ID=2,工作节点ID=1

同一毫秒内,三台机器生成的ID:

机器A:时间戳 | 1(数据中心) | 1(工作节点) | 序列号
机器B:时间戳 | 1(数据中心) | 2(工作节点) | 序列号
机器C:时间戳 | 2(数据中心) | 1(工作节点) | 序列号

即使时间戳和序列号相同,机器ID不同 → 最终ID不同!


第六步:常见问题解答

1. 为什么时间戳占41位?

• 41位二进制能表示的时间范围是 2^41 / 1000 / 3600 / 24 / 365 ≈ 69年
• 如果从2020年开始,可以用到2089年。

2. 时钟回拨怎么办?

原因:服务器时间被手动调整或NTP同步导致时间倒退。
处理:代码中直接抛出异常(生产环境可优化为等待时钟追上)。

3. 序列号为什么是12位?

• 12位支持每毫秒生成 4096个ID2^12 = 4096),足够大多数场景使用。


总结

雪花算法的分布式核心就是:

  1. 分蛋糕:把64位分成时间、机器ID、序列号。
  2. 唯一机器ID:确保不同机器的ID不冲突。
  3. 时间有序:时间戳保证ID整体递增,适合数据库索引。

代码中的位运算就像拼乐高积木,把时间、机器编号、序列号拼成一个完整的ID。你提到的这一点非常重要!这里涉及到位运算二进制补码的知识,我来详细拆解这个计算过程,保证彻底讲清楚。


问题聚焦

代码中的这两行:

private static final long MAX_DATA_CENTER_ID = ~(-1L << DATA_CENTER_ID_BITS);
private static final long MAX_WORKER_ID = ~(-1L << WORKER_ID_BITS);

为什么 DATA_CENTER_ID_BITS = 5 时,MAX_DATA_CENTER_ID = 31?如何通过位运算得出这个结果?


第一步:理解二进制补码

在计算机中,负数用补码表示。例如:
-1 的二进制补码形式是:11111111 11111111 ... 11111111(64位全1)。


**第二步:分步计算 **~(-1L << 5)

DATA_CENTER_ID_BITS = 5 为例:

  1. **计算 **-1L << 5
    -1L 的二进制:11111111 11111111 ... 11111111(64位全1)。
    • 左移5位后:
11111111 11111111 ... 11111111 00000  
↑ 左侧丢弃5位,右侧补5个0

• 结果仍是一个负数(最高位是1)。

  1. 按位取反 ~ 操作
    • 对 111...11100000 取反:
00000000 00000000 ... 00000000 11111  
↑ 所有位取反(0变1,1变0)

• 此时最高位是0,表示正数。

  1. 转换为十进制
    • 二进制 000...0011111 的十进制是 2^4 + 2^3 + 2^2 + 2^1 + 2^0 = 31

通用公式

• 对于 n 位:~(-1L << n) = 2^n - 1
例如:
n=52^5-1=31
n=102^10-1=1023


为什么不用 2^n - 1 直接赋值?

代码中通过位运算动态计算最大值,有两个优点:

  1. 可读性:直接体现“用n位表示最大值”的逻辑。
  2. 可维护性:若未来调整位数(如改为6位),无需手动计算 2^6-1=63,代码自动适应。

代码中的验证逻辑

构造函数中检查数据中心ID和工作节点ID是否超过最大值:

public SnowflakeIdGenerator(long dataCenterId, long workerId) {if (dataCenterId > MAX_DATA_CENTER_ID || dataCenterId < 0) {throw new IllegalArgumentException("DataCenter ID 超出范围");}// 同理检查workerId
}

• 若传入 dataCenterId=32(超过31),会直接抛出异常,防止生成重复ID。


举例验证

假设 DATA_CENTER_ID_BITS = 3(最大值应为 2^3-1=7):

  1. -1L << 3111...11111111000(64位)。
  2. 取反后 → 000...00000000111(二进制7)。
  3. MAX_DATA_CENTER_ID = 7

总结

核心逻辑:通过左移和取反计算n位能表示的最大正整数。
位运算技巧:利用补码和位移动态计算最大值,避免硬编码。
设计意图:确保机器ID在指定范围内,防止分布式系统中ID冲突。好的!我再用一个更生活化的比喻和分步拆解,确保彻底讲明白这段代码的逻辑。


比喻:楼层与房间号

想象你要为一家全球连锁酒店设计房间号,规则如下:

  1. 酒店编号:区分不同国家/城市的酒店(如北京=01,上海=02)。
  2. 分店编号:同一城市的不同分店(如北京分店A=001,分店B=002)。
  3. 时间戳:记录房间分配的日期(如20231025)。
  4. 序列号:同一天内分配的房间顺序(如0001, 0002)。

最终房间号格式:时间戳 + 酒店编号 + 分店编号 + 序列号,例如:
20231025 01 001 0001 → 北京分店A在2023年10月25日分配的第1个房间。


对应雪花算法

将上述规则映射到雪花算法的64位ID:
时间戳:占据高位(相当于日期)。
数据中心ID(酒店编号):区分不同数据中心。
工作节点ID(分店编号):同一数据中心的不同机器。
序列号:同一毫秒内的顺序号。


代码逐行拆解

1. 定义左移位数
private static final long WORKER_ID_SHIFT = SEQUENCE_BITS;
private static final long DATA_CENTER_ID_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS;
private static final long TIMESTAMP_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS + DATA_CENTER_ID_BITS;

作用:计算每个部分在二进制中的起始位置
示例(假设配置):
• 序列号占12位(SEQUENCE_BITS=12
• 工作节点ID占5位(WORKER_ID_BITS=5
• 数据中心ID占5位(DATA_CENTER_ID_BITS=5

计算逻辑
工作节点ID需要左移序列号的位数(12位),占据第13~17位。
数据中心ID需要左移序列号+工作节点ID位数(12+5=17位),占据第18~22位。
时间戳需要左移序列号+工作节点ID+数据中心ID位数(12+5+5=22位),占据第23~63位。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


2. 成员变量
private final long dataCenterId;  // 数据中心ID(如:1)
private final long workerId;      // 工作节点ID(如:2)
private long sequence = 0L;       // 序列号(每毫秒从0开始)
private long lastTimestamp = -1L; // 上一次生成ID的时间(毫秒级)

作用
dataCenterIdworkerId:唯一标识一台机器(类似酒店和分店编号)。
sequence:同一毫秒内的递增序号(解决并发问题)。
lastTimestamp:记录上一次生成ID的时间,用于检测时钟回拨。


分步演示生成ID

假设数据

• 当前时间戳:1609459205000(2020-01-01 00:00:05)
• 数据中心ID:1(二进制 00001
• 工作节点ID:2(二进制 00010
• 序列号:3(二进制 000000000011

步骤1:计算时间差
long timestampDiff = currentTimestamp - START_TIMESTAMP;
// 1609459205000 - 1609459200000 = 5000(毫秒)
步骤2:各部分左移

时间戳部分
5000 << 22
二进制:0000000000000000000000000000000000000000010011100010000000000000
数据中心ID部分
1 << 17
二进制:0000000000000000000000000000000000000000000000000010000000000000
工作节点ID部分
2 << 12
二进制:0000000000000000000000000000000000000000000000000000001000000000
序列号部分
3
二进制:0000000000000000000000000000000000000000000000000000000000000011

步骤3:合并各部分(按位或运算)
时间戳部分 | 数据中心ID部分 | 工作节点ID部分 | 序列号部分
= 0000000000000000000000000000000000000000010011100010000000000000| 0000000000000000000000000000000000000000000000000010000000000000| 0000000000000000000000000000000000000000000000000000001000000000| 0000000000000000000000000000000000000000000000000000000000000011
= 0000000000000000000000000000000000000000010011100010001000000011

十进制结果:5000 << 22 | 1 << 17 | 2 << 12 | 3 = 20971520000 + 131072 + 8192 + 3 = 20972852787


关键设计思想

  1. 唯一性:通过dataCenterIdworkerId区分不同机器。
  2. 有序性:时间戳在高位,整体ID趋势递增。
  3. 高性能:位运算和本地计算,无需网络请求。

总结

位移常量:决定每部分在ID中的位置(类似酒店房间号的“区段”)。
成员变量:存储机器标识和时间信息,通过位移拼接成唯一ID。
本质:把时间、机器、序列号信息编码到一个64位数字中,像拼图一样严丝合缝。

相关文章:

Java雪花算法

以下是用Java实现的雪花算法代码示例&#xff0c;包含详细注释和异常处理&#xff1a; 代码下面有解析 public class SnowflakeIdGenerator {// 起始时间戳&#xff08;2020-01-01 00:00:00&#xff09;private static final long START_TIMESTAMP 1577836800000L;// 各部分…...

【中大厂面试题】TCP 校招 java 后端最新面试题

TCL&#xff08;一面&#xff09; 1. Spring 初始化Bean前要做什么&#xff1f;有几种方式 在 Spring 容器调用 Bean 的初始化方法&#xff08;如 init-method、PostConstruct 等&#xff09;之前&#xff0c;会按顺序完成以下关键步骤&#xff1a;实例化 → 属性注入 → Aw…...

【教学类-102-11】蝴蝶外轮廓01——Python对黑白图片进行PS填充三种颜色+图案描边+图案填充白色+制作1图2图6图24图

背景需求: 用Python,对白色255背景的图片进行了透明化、制作点状或线段的描边裁剪线 【教学类-102-10】剪纸图案全套代码09——Python线条虚线优化版04(原图放大白背景)+制作1图2图6图24图-CSDN博客文章浏览阅读1k次,点赞27次,收藏8次。【教学类-102-10】剪纸图案全套代…...

【数据库系统概论】第3章 SQL(四)视图(超详细)

视图&#xff08;View&#xff09;是数据库中的虚拟表 通过执行查询定义并存储在数据库中&#xff0c;可以像普通表一样被查询和使用。 视图本身并不存储数据&#xff0c;而是基于一个或多个表的查询结果动态生成。 视图的概念 视图( View )是由其它表或视图上的查询所定义…...

HTTP:六.HTTP代理相关介绍

什么是HTTP代理 代理是指获授权代表他人执行操作的人员,代理服务器在在线世界中提供此操作。 代理服务器 充当用户和互联网之间的网关,并防止访问网络以外的任何人。通过 Web 浏览器定期访问互联网,使用户能够直接与网站连接。但是代理充当中间人,代表用户与网页通信。 当…...

【Python爬虫】详细工作流程以及组成部分

目录 一、Python爬虫的详细工作流程 确定起始网页 发送 HTTP 请求 解析 HTML 处理数据 跟踪链接 递归抓取 存储数据 二、Python爬虫的组成部分 请求模块 解析模块 数据处理模块 存储模块 调度模块 反爬虫处理模块 一、Python爬虫的详细工作流程 在进行网络爬虫工…...

深入解析UML图:版本演变、静态图与动态图详解

目录 前言1 UML的版本演变1.1 UML 1.x阶段&#xff1a;统一的开始1.2 UML 2.x阶段&#xff1a;功能的扩展与深化 2 UML图的分类概述3 UML静态图详解3.1 类图&#xff08;Class Diagram&#xff09;3.2 对象图&#xff08;Object Diagram&#xff09;3.3 组件图&#xff08;Comp…...

老旧测试用例生成平台异步任务与用户通知优化

在现代 Web 开发中&#xff0c;异步任务处理和用户通知是两个重要的功能。由于老旧测试平台【测试用例生成平台&#xff0c;源码分享】进行智能化升级后&#xff0c;未采用异步任务处理&#xff0c;大模型推理时间较长&#xff0c;导致任务阻塞&#xff0c;无法处理其他任务&am…...

数据结构初阶:队列

本篇博客主要讲解队列的相关知识。 目录 1.队列 1.1 概念与结构 1.2 队列头文件&#xff08;Queue.h&#xff09; 1.2.1 定义队列结点结构 1.2.2 定义队列的结构 1.3 队列源代码&#xff08;Queue.h&#xff09; 1.3.1 队列的初始化 1.3.2 队列的销毁 1.3.3 入队---队尾 1…...

苍穹外卖。12 数据统计

12.1 工作台 12.1.1 需求分析与设计 12.1.2 代码导入 12.1.3 测试 测试通过 12.2 Apache POI 12.2.1 需求分析与设计 12.2.2 案例 column表示索引行...

WebSocket 和 HTTP长轮询

一、HTTP长轮询&#xff08;Long Polling&#xff09; 1. 工作原理 传统轮询&#xff08;低效&#xff09;&#xff1a;客户端每隔几秒向服务器发一次请求&#xff0c;问“有新数据吗&#xff1f;”&#xff0c;即使服务器没有数据也会立即返回“无”。长轮询&#xff08;改进…...

高等数学同步测试卷 同济7版 试卷部分 上 做题记录 第三章微分中值定理与导数的应用同步测试卷 B 卷

第三章微分中值定理与导数的应用同步测试卷 B 卷 一、单项选择题(本大题共5小题,每小题3分,总计15分) 1. 2. 3. 4. 5. 二、填空题(本大题共5小题,每小题3分,总计15 分) 6. 7. 8. 9. 10. 三、求解下列各题(本大题共5小题,每小题6分,总计 3…...

生成式引擎优化(GEO)发展史与行业标准演变

一、生成式引擎优化&#xff08;GEO&#xff09;发展史与行业标准演变 随着 ChatGPT、Bard、Claude、文心一言等生成式AI搜索产品快速发展&#xff0c;GEO&#xff08;Generative Engine Optimization&#xff0c;生成式引擎优化&#xff09;也应运而生&#xff0c;成为继SEO、…...

美客多自养号测评技术解析:如何低成本打造安全稳定的测评体系

美客多&#xff08;MercadoLibre&#xff09;自养号测评系统的搭建需综合考虑硬件、软件、网络环境及操作流程的合规性&#xff0c;以下是基于多篇行业指南整理的核心步骤与要点&#xff1a; 一、前期规划与准备 1. 明确目标与规则 • 确定测评目的&#xff08;如提升产品曝…...

STM32单片机入门学习——第36节: [11-1] SPI通信协议

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.04.14 STM32开发板学习——第36节: [11-1] SPI通信协议 前言开发板说明引用解答和科普一…...

Qt QML - qmldir使用方法详解

以实际例子看qmldir的使用 1.搞一个qmldir2.让QML找到你的qmldir &#xff08;重点&#xff09;.pro 工程文件QQmlApplicationEngine加载主QML处 3.用起来你的模块 qmldir是Qt QML模块化的基石&#xff0c;其设计初衷是为解决QML文件的组织、复用和依赖管理问题,。只需要在每个…...

AI大模型赋能工业制造:智能工厂的全新跃迁路径

📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 引言:从自动化到智造化,工业领域的AI革命正悄然发生 在过去几十年中,制造业经历了机械化、电气化和自动化三次浪潮。如今,第四次工业革命——以人工智能、大数据、云计算、物联网为代表的“工业…...

LanDiff:赋能视频创作,语言与扩散模型的融合力量

自从 Wan 2.1 发布以来&#xff0c;AI 视频生成领域似乎进入了一个发展瓶颈期&#xff0c;但这也让人隐隐感到&#xff1a;“DeepSeek 时刻”即将到来&#xff01;就在前几天&#xff0c;浙江大学与月之暗面联合推出了一款全新的文本到视频&#xff08;T2V&#xff09;生成模型…...

Windows 图形显示驱动开发-WDDM 1.2功能~显示设备的容器id支持

容器 ID 设备驱动程序接口 (DDI) 在显示微型端口驱动程序中实现此函数和结构&#xff1a; DxgkDdiGetChildContainerIdDXGK_CHILD_CONTAINER_ID 容器 ID 说明 监视设备中的新功能可以提供更好的用户体验。 具体而言&#xff0c;通用串行总线 (USB) 集线器是监视器上用于连…...

基于PyQt5和OpenCV的传统图像分割应用UI程序

目录 1. 程序概述 2. 用户界面设计 主窗口布局 图像显示区域 控制面板区域 3. 核心功能实现 图像处理功能 关键方法 4. 特色实现 区域生长算法改进 分水岭算法改进 GrabCut算法改进 5. 用户体验优化 6. 技术栈 7. 使用说明 8. 完整代码 9. 测试结果 本文实现了…...

java使用HTTP实现多线程爬取数据

Java中使用HTTP多线程爬取数据。首先&#xff0c;我得理解他们的需求。可能想要高效地抓取大量网页数据&#xff0c;而单线程可能不够快&#xff0c;所以需要多线程来提高效率。不过&#xff0c;多线程爬虫需要考虑的问题挺多的&#xff0c;比如线程安全、请求频率控制、异常处…...

08【基础学习】串口通信(三):收发数据包+数据校验

收发数据包数据校验 1、和校验异或校验1.1、HEX固定长度数据包校验1.2、HEX不固定长度数据包校验 2、CRC校验 1、和校验异或校验 和校验&#xff1a;将接收到的数据全部相加后&#xff0c;取结果的最后一个字节的数据 异或校验&#xff1a;将接收到的数据全部相异或后&#xff…...

已开源!CMU提出NavRL :基于强化学习的无人机自主导航和动态避障新方案

导读在无人机技术快速发展的今天&#xff0c;如何确保无人机在复杂动态环境中的安全飞行成为一个关键挑战。传统的导航方法通常将决策过程分解为预测和规划两个独立模块&#xff0c;这种手工设计的系统虽然在特定环境中表现良好&#xff0c;但当环境条件发生变化时&#xff0c;…...

C++ (类的设计,对象的创建,this指针,构造函数)

类的设计 C对结构体是有增强的 可以包含函数作为结构体成员 可以直接定义变量 在结构体成员函数里面可以直接访问结构体成员变量 struct student{string name;int age;float score;void play_game(const string &name);}void student::play_game(const string game){}…...

【C++】——lambda表达式

&#x1f31f; 前言:​​C Lambda表达式,当函数开始"叛逆期"​​ 你是否有过这样的崩溃瞬间&#xff1f; 为了写个​​只用到一次​​的排序规则&#xff0c;被迫定义了一个类在std::for_each里塞函数指针&#xff0c;代码瞬间变成"古董级"写法看着层的循环…...

DHCP简单例子

本文描述了使用ENsp模拟DHCP Global和DHCP 中继两种简单配置过程。 拓朴图 DHCP全局配置 此配置较为简单&#xff0c;因为全局既支持局域网&#xff0c;也支持跨网络分配。 # DHCP Server1 <Huawei>system-view [Huawei]sysname server1 [server1]dhcp enable …...

Spark-SQL简介及核心编程

Spark-SQL概述&#xff1a;是Spark用于结构化数据处理的模块&#xff0c;前身是Shark。Shark基于Hive开发&#xff0c;使SQL-on-Hadoop性能大幅提升&#xff0c;但对Hive依赖制约了Spark发展。SparkSQL汲取Shark优点并重新开发&#xff0c;在数据兼容、性能优化和组件扩展上优势…...

LDAP渗透测试

LDAP渗透测试 1.LDAP协议概述2.LDAP写公钥3.暴力破解LDAP4.LDAP信息收集ldapdomaindumpwindapsearch工具ldapsearch 1.LDAP协议概述 LDAP&#xff08;Lightweight Directory Access Protocol&#xff0c;轻量目录访问协议&#xff09;是一种访问和管理目录服务的应用层协议&am…...

观察者模式(行为模式)

观察者模式 观察者模式属于行为模式&#xff0c;个人理解&#xff1a;和发布订阅者魔模式是有区别的 细分有两种&#xff1a;推模式和拉模式两种&#xff0c;具体区别在于推模式会自带推送参数&#xff0c;拉模式是在接收通知后要自己获取更新参数 观察者模式&#xff08;Obs…...

Spark SQL

Spark SQL Spark SQL 是 Spark 用于结构化数据(structured data)处理的 Spark 模块。 Spark SQL特点 易整合。无缝的整合了 SQL 查询和 Spark 编程 统一的数据访问。使用相同的方式连接不同的数据源 兼容 Hive。在已有的仓库上直接运行 SQL 或者 HQL 标准数据连接。通过 JDBC…...

周末学习笔记:Python文件操作(结构化数据转换与文件处理)

目录 一、任务目标 二、实现步骤与代码解析 2.1 数据准备阶段 关键点解析&#xff1a; 2.2 数据转换核心代码 三、关键技术解析 3.1 字符串处理方法 3.2 数据结构转换 3.3 文件写入技巧 四、执行结果验证 输入文件t1.txt内容&#xff1a; 输出文件t2.txt内容&am…...

【PCIE736-0】基于 PCIE X16 总线架构的 4 路 QSFP28 100G 光纤通道处理平台

产品概述 PCIE736-0 是一款基于 PCIE 总线架构的 4 路 QSFP28 100G 光纤通道适配器&#xff0c;该板卡具有 1 个 PCIe Gen3x16 主机接口、一共 4个 QSFP28 100G 光纤接口&#xff0c;可以实现 4 路 QSFP28 100G 光纤的数据实时采集、实时缓存与 PCIE 高速传输。该板卡采用 Xil…...

PyCharm 开发工具 修改背景颜色

PyCharm 开发工具 修改背景颜色 提示&#xff1a;帮帮志会陆续更新非常多的IT技术知识&#xff0c;希望分享的内容对您有用。本章分享的是Python基础语法。前后每一小节的内容是有学习/理解关联性&#xff0c;希望对您有用~ PyCharm 开发工具 修改背景颜色 文章目录 PyCharm 开…...

linux Shell编程之循环语句(三)

目录 一. for 循环语句 1. for语句的结构 2. for 语句应用示例 (1) 根据姓名列表批量添加用户 (2) 根据 IP 地址列表检查主机状态 二. 使用 while 循环语句 1. while 语句的结构 2. while 语句应用示例 (1) 批量添加规律编号的用户 (2) 猜价格游戏 三. until 循环语…...

GCC和GDB基础知识

1 GCC和G 一套开源的​​编译器​​&#xff0c;支持 C、C、Fortran 等语言。它负责将人类编写的源代码&#xff08;如 .c 文件&#xff09;翻译成计算机能执行的二进制文件&#xff08;如 .exe&#xff09;。 ​​核心作用​​&#xff1a; ​​预处理​​&#xff1a;处理宏…...

网络复习二(TCP【3】)

一、为什么TIME_WAIT等待的时间是2MSL&#xff1f; MSL&#xff1a;报文最大生存时间 我们要知道TCP报文是基于IP协议生存的&#xff0c;而在IP头中有一个TTL&#xff08;经过路由跳数&#xff09;&#xff0c;当TTL为0使&#xff0c;数据报被丢失&#xff0c;同时发送ICMP报…...

【5G通信】通过RRC重配实现功率调整的可能性

在5G网络中&#xff0c;通过解析UE Capability Information消息中的RF Parameters字段实现终端发射功率的动态调整&#xff0c;需要结合协议规范、射频特性及网络控制策略。以下是技术实现流程及示例&#xff1a; 一、RF Parameters关键字段解析 根据3GPP TS 38.331和TS 38.10…...

UE 使用事件分发器设计程序

【双字精译】虚幻引擎中的设计模式&#xff1a;观察者模式——Ali Elzoheiry|游戏开发游戏编程模式游戏设计模式虚幻蓝图编程事件分发器UnrealEngineUE5_哔哩哔哩_bilibili 创建一个事件分发器&#xff0c;这里是放在死亡事件里 比如计算场景中的敌人数量&#xff0c;这个UI是…...

前端面试宝典---原型链

引言----感谢大佬的讲解 大佬链接 原型链示意图 原型链问题中需要记住一句话&#xff1a;一切变量和函数都可以并且只能通过__proto__去找它所在原型链上的属性与方法 原型链需要注意的点 看上图可以发现 函数&#xff08;构造函数&#xff09;也可以通过__proto__去找到原…...

ViT 模型讲解

文章目录 一、模型的诞生背景1.1 背景1.2 ViT 的提出&#xff08;2020年&#xff09; 二、模型架构2.1 patch2.2 模型结构2.2.1 数据 shape 变化2.2.2 代码示例2.2.3 模型结构图 2.3 关于空间信息 三、实验3.1 主要实验3.2 消融实验 四、先验问题4.1 归纳偏置4.2 先验or大数据&…...

【技术文章的标准结构与内容指南】

技术文章的标准结构与内容指南 技术文章是传递专业知识、分享实践经验的重要媒介。一篇高质量的技术文章不仅能够帮助读者解决问题&#xff0c;还能促进技术交流与创新。以下是技术文章通常包含的核心内容与结构指南。 1. 标题 一个好的技术文章标题应当&#xff1a; 简洁明…...

Mysql概述

一、数据库相关概念 1.数据库(Data Base &#xff0c;简称DB)是长期存储在计算机中有组织、可管理、可共享的数据集合。 2.数据库管理系统(Database Management System&#xff0c;简称为 DBMS)是管理数据库的系统软件 3.MySQL数据库全称为MySQL数据库管理系统 3.SQL语言(S…...

系统设计模块之安全架构设计(身份认证与授权(OAuth2.0、JWT、RBAC/ABAC))

一、OAuth 2.0&#xff1a;开放授权框架 OAuth 2.0 是一种标准化的授权协议&#xff0c;允许第三方应用在用户授权下访问其资源&#xff0c;而无需直接暴露用户密码。其核心目标是 分离身份验证与授权&#xff0c;提升安全性与灵活性。 1. 核心概念与流程 角色划分&#xff…...

如何管理“灰色时间”导致的成本漏洞

明确时间记录机制、优化流程透明度、应用自动化工具、强化绩效考核机制、提高员工时间意识 来有效管理。其中&#xff0c;明确时间记录机制 是最关键的一步。通过统一的时间记录平台&#xff0c;例如Toggl Track、Clockify或企业级工时系统&#xff0c;不仅可以实时掌握员工工作…...

程序化广告行业(84/89):4A广告代理公司与行业资质解读

程序化广告行业&#xff08;84/89&#xff09;&#xff1a;4A广告代理公司与行业资质解读 大家好&#xff01;在探索程序化广告行业的道路上&#xff0c;每一次知识的分享都是我们共同进步的阶梯。一直以来&#xff0c;我都希望能和大家携手前行&#xff0c;深入了解这个充满机…...

MTK Android12-13 -Intent Filter Verification Service 停止运行

MTK Android12-13 -Intent Filter Verification Service 停止运行 问题修复 文章目录 参考资料解决方案-修改文件源码分析源码 StatementService配置加载config_appsNotReportingCrashesActivityManagerService -retrieveSettings 加载配置AppErrors-loadAppsNotReportingCrash…...

Sentinel源码—1.使用演示和简介二

大纲 1.Sentinel流量治理框架简介 2.Sentinel源码编译及Demo演示 3.Dashboard功能介绍 4.流控规则使用演示 5.熔断规则使用演示 6.热点规则使用演示 7.授权规则使用演示 8.系统规则使用演示 9.集群流控使用演示 5.熔断规则使用演示 (1)案例说明熔断和降级 (2)Sentin…...

基于Geotools的PostGIS原始操作之CQL过滤及按属性名称生成面属性时间-以湖北省地级市行政区划为例

目录 前言 背景与意义 技术方法概述 一、CQL查询实现 1、CQL查询原理 2、Geotools中的CQL实现 二、SLD编程式样式生成 1、获取唯一的分类值 2、生成不同颜色分类 3、集成生成SLD的Style文件 三、总结 前言 随着地理信息系统&#xff08;GIS&#xff09;技术的快速发展…...

Linux内核中struct net_protocol的early_demux字段解析

背景问题 在内核版本4.19.0-25的头文件中,struct net_protocol结构体的定义未显式包含early_demux字段。然而,在内核版本4.19的源代码中可以看到tcp_protocol实例化时却对该字段进行了赋值: static struct net_protocol tcp_protocol = {.early_demux = tcp_v4_earl…...

TLS协议四次握手原理详解,密钥套件采用DH密钥交换算法

目录 1.TLS协议握手概述 2.TLS协议握手具体步骤 2.1.TLS第一次握手 2.2.TLS第二次握手 2.3.TLS第三次握手 2.4.TLS第四次握手 3.DH密钥交换算法 1.TLS协议握手概述 第一步客户端会发起一个消息&#xff0c;携带了TLS的版本号&#xff0c;客户端随机数&#xff0c;密码套…...