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

如何选择合适的主键id?

目录标题

  • MySQL主键一定是自增的吗?
  • 自增id、uuid、雪花算法 谁更合适?
  • 详细聊聊 UUID
  • 详细聊聊 雪花算法

在数据库设计中,选择合适的主键对于数据表的性能和数据完整性都非常重要。接下来,让我们探讨一下自增id、uuid和雪花算法,以便更好地理解哪种适合作为主键。

MySQL主键一定是自增的吗?

常见的一个误解是认为MySQL的主键一定是自增的,但实际上,主键并非必须是自增的。主键可以根据需求自行选择,可以选取任何数据类型作为主键!通常单独创建一个自增字段作为主键的好处包括自增id是数字,比UUID占用的位数少,节省存储空间。由于id是递增的,在B+Tree索引中查询效率高。在分页时,通过id解决深度分页问题。然而,使用自增主键也存在问题在分库分表时,无法依赖单表的自增主键作为主键,可能导致重复和冲突。由于id是自增的,系统可能存在一定安全风险,规律性可能为潜在攻击者提供线索。

深度分页问题是指在进行分页查询时,随着页码(偏移量)的增加,数据库需要跳过大量记录,导致查询性能急剧下降。主要原因是偏移量过大导致的索引失效和资源消耗增加。使用自增ID,可以采用键值分页(Keyset Pagination)的方法,避免使用OFFSET,从而提高查询性能。具体做法是:

  1. 在第一次查询时,获取当前页的最后一条记录的ID。
  2. 在下一次查询时,使用这个ID作为起点,继续查询下一页的数据。

自增id、uuid、雪花算法 谁更合适?

我觉得吧没有好不好,只有需求场景适合不适合。三者都有各自的优缺点,和适合的场景。

自增id,在MySQL中可以通过设置 AUTO_INCREMENT 属性实现id的自增长。

  • 优点
    • 自增id是数字,占用的位数比uuid小多了,所以在存储空间上也节省很多;
    • id是递增的,因此在B+Tree索引时,查询效率较高。在分页的时候,也可以通过id解决深度分页问题。
  • 缺点
    • 当我们做分库分表的时候,就没办法依赖一张表的自增主键来作为主键id了,这样就会发生重复导致冲突的问题;
    • 因为id是自增的,那么就可以预测到,给系统带来了一定的安全风险。

UUID,是一个 128 位长的唯一标识符,通常以字符串形式表示。它可以使用不同的算法生成,比如基于时间戳的UUID(版本1)和 随机数生成的UUID(版本4)等。

  • 优点
    • 无论使用不同的算法生成,几乎都可以保证在全球范围内唯一,避免了多台机器之间主键冲突的问题,适用于分布式系统后中;
    • 采用随机数生成的UUID很难被猜测出来,对于需要保密性的应用场景较为合适。
  • 缺点
    • UUID通常以128位的字符串形式存储,占用的存储空间比较大;
    • 因为UUID不是自增的,所以在做范围查询的时候是不支持的;
    • 再就是查询效率低下:
      • 比如说:在UUID列上创建索引,因为它很长,索引的也会变得非常大。大的索引会占用更多的磁盘空间,导致缓存命中率下降,进而增加了磁盘I/O的需求。另外,大的索引还会导致查询时内存开销增加;
      • 另外,因为UUID不自增的,新插入的值可能会插入到叶子节点的中间位置。这可能导致B+树平衡操作频繁进行,从而增加了写入的开销。树的平衡操作涉及到数据的重新排序和移动,这还会影响到查询的性能。

雪花算法,是Twitter研发的一种分布式ID生成算法,它可以生成全局唯一且递增的id。算法的核心思想是将一个64位的id划分为多个部分,分别对应着符号位、时间戳、数据中心标识、机器标识、序列化。

  • 优点
    • 全局唯一:雪花算法生成的ID是64位的整数,可以保证在全球范围内唯一,适用于分布式系统;
    • 有序性:生成的ID是递增的,这对于数据库中的索引和查询优化非常有利;
    • 高性能:生成ID的速度非常快,每秒可以生成数十万个ID,适合高并发场景;
    • 低存储成本:64位的整数相比128位的UUID占用更少的存储空间;
    • 可追溯性:ID中包含了时间戳信息,可以通过ID反推出生成时间,便于日志记录和问题排查。
  • 缺点
    • 时间回拨问题:如果服务器的时间被回拨,可能会导致生成的ID重复。可以通过配置NTP同步时间来缓解这个问题;
    • 依赖系统时间:生成ID依赖于系统时间,如果系统时间不准确,可能会影响ID的生成;
    • 单点故障:默认情况下,雪花算法的ID生成器是单点的,如果ID生成器出现故障,可能会影响整个系统的可用性。可以通过集群部署来解决这个问题;
    • ID泄露:由于生成的ID是有序的,可能会暴露一些系统内部的信息,例如生成ID的时间和机器编号。对于需要高度保密的应用场景,这可能是一个安全风险。

总的来说

  • 自增ID:适用于单个数据库实例或单表的情况,适用于低并发、简单应用;
  • UUID:适用于需要全局唯一且对安全性要求较高的分布式系统,如金融交易系统中的订单号;
  • 雪花算法:适用于需要全局唯一且对性能和存储有较高要求的分布式系统,尤其是高并发场景。如:大型电商平台中的订单号、社交网络中的用户ID。

详细聊聊 UUID

UUID 中文意思就是“全局唯一标识符”,它的目标是在同一时空中的所有机器都是唯一的。UUID 是一种128位的数字,通常为32个十六进制数字,分为五组表示。

  • 优点:UUID的性能比较高,不依赖网络,本地就可以生成,使用起来也比较简单;
  • 缺点:长度过长、没有任何含义;
  • 不自增有好处有坏处,
    • 好处是没有可溯性,适用于安全性要求较高的应用;
    • 坏处是新插入的值可能会插入到叶子节点的中间位置。这可能导致B+树平衡操作频繁进行,从而增加了写入的开销。树的平衡操作涉及到数据的重新排序和移动,这还会影响到查询的性能。

标准的UUID:43c20451-f3d5-4829-99aa-4ceca2a32d6d(8-4-4-4-12)。

UUID 在具体实现上有多个版本,java中的java.util.UUID生成的UUID是V3和V4。以下是各个版本的实现:

v1. 基于时间戳的UUID
      基于时间戳、随机数、MAC地址,适用于需要时间顺序的场景。
      由于在算法中使用了MAC地址,这个版本的UUID可以保证在全球范围的唯一性。但与此同时,使用MAC地址会带来安全性问题。(mac地址就是网卡上的唯一标识,通过获取到一个MAC地址生成的大量UUID,可以被反向解析出MAC地址,进而获取设备的物理位置或用户身份信息,遭受网络攻击。)

v2. DCE 安全版本
      基于时间戳、MAC地址和POSIX UID/GID,较少使用。
      相较于v1基于时间戳UUID算法相同,但是会把时间戳的前4位换为POSIX的UID或GID。这个版本的UUID在实际上较少用到。

v3. 基于命名空间的UUID
      基于命名空间和名称的MD5哈希,适用于需要根据特定名称生成唯一标识的场景。格式:md5(namespace + name)
      名称和命名空间的组合确保了生成的UUID的唯一性。

v4. 基于随机数的UUID
      完全基于随机数,最常用的版本,适用于需要高度保密性的场景。
      生成的UUID是完全随机的,适用于需要高度保密性的场景。但是因为是基于随机数的,所以并不适合数据量特别大的场景。

v5. 基于名称空间的UUID
      基于命名空间和名称的SHA-1哈希,适用于需要更高安全性的场景。格式:sha1(namespace + name)
      与v3类似,只是散列值计算使用SHA-1哈希算法,生成的UUID更加安全。

详细聊聊 雪花算法

雪花算法(Snowflake Algorithm)是由Twitter开发的一种分布式ID生成算法,旨在生成全局唯一且递增的ID。该算法通过将64位的ID划分为多个部分来实现这一目标,每个部分都有特定的含义和作用。
雪花算法的结构大致如下:

  1. 符号位(1位):固定为0,表示这是一个正数。
  2. 时间戳(41位):表示毫秒级的时间戳,从某个起始时间(例如2022-01-01 00:00:00)开始计算。41位的时间戳可以表示大约69年的时间范围。
  3. 数据中心标识(10位):用于标识不同的数据中心,最多可以有1024个数据中心。
  4. 机器标识(10位):用于标识同一数据中心内的不同机器,最多可以有1024台机器。
  5. 序列号(12位):用于在同一毫秒内生成多个ID时,确保ID的唯一性。最多可以有4096个序列号。
    在这里插入图片描述
    基于以上结构,雪花算法在唯一性保证方面就有很多优势:
    ● 首先,时间戳基于最高位,保证新生成的id比旧的id大;
    ● 其次,引入了数据中心标识和机器标识,该标识都可以手动配置,帮助业务来保证不同的数据中心和机器能生存不同的id;
    ● 还有就是引入了序列号,用来解决同一毫秒内多次生成ID的问题(每次生成id时序列号都会自增,因此不同id在序列号上有区别);

所以,基于时间戳+数据中心标识+机器标识+序列号,保证了不同进程中主键的不重复,在相同进程中主键的有序性。
但是在实际使用中会存在时钟回拨问题,即 雪花算法使用时间戳作为生成id的一部分,如果系统时钟回拨(即时间倒退),可能会导致生成的id不递增。 为了处理这种情况,雪花算法通常会抛出异常或等待时钟恢复到正常状态;

  • 美团leaf引入了zookeeper来解决时钟回拨问题,其大致思路为“每个Leaf运行时定时向 zk 上报时间戳,每次 leaf 服务启动后,先校验本地时间与上次发 id 的时间,再校验与 zk 上所有节点的平均时间戳。如果任何一个阶段有异常,那么就会启动失败报警”
  • 百度的UidGenerator中有两种UidGenerator,
    • 其中DefautlUidGenerator使用了System.currentTimeMillis()获取时间与上一次时间比较,当发生时钟回拨时,抛出异常。
    • 而CachedUidGenerator使用是放弃了对机器的时间戳的强依赖,而是改用AtomicLong的incrementAndGet()来获取下一次时间,从而脱离了对服务器时间的依赖。

相关文章:

如何选择合适的主键id?

目录标题 MySQL主键一定是自增的吗?自增id、uuid、雪花算法 谁更合适?详细聊聊 UUID详细聊聊 雪花算法 在数据库设计中,选择合适的主键对于数据表的性能和数据完整性都非常重要。接下来,让我们探讨一下自增id、uuid和雪花算法&…...

OpenMP出现Stack Overflow及其疑问

今天对着《OpenMP核心技术指南》练习OpenMP&#xff0c;其中一个案例: #include <stdio.h> #include <math.h> #include <omp.h>#define ITER 100000000void main() {int i;double A[ITER];for (i 0; i < ITER; i)A[i] 2.0 * i;#pragma omp parallel{/…...

vscode查找函数调用

在 VS Code 中&#xff0c;要查找 C 语言函数的调用列表&#xff0c;有以下几种方法可以使用&#xff0c;具体取决于项目的规模和你的需求&#xff1a; 方法 1: 使用全局查找功能 步骤&#xff1a; 打开全局查找&#xff1a; 按 CtrlShiftF (Windows/Linux) 或 CmdShiftF (Ma…...

网络安全-网络安全审计

网络安全审计是为了确保网络系统的安全性和完整性&#xff0c;防范潜在的网络攻击和数据泄露风险。 审计步骤&#xff1a; 1.确定审计目标&#xff1a;明确审计的目的和范围&#xff0c;例如审计网络设备、服务器、应用程序或数据库等。 2.收集信息&#xff1a;收集审计范围…...

刷LeetCode hot100--1.哈希表

哈希表--查找一个元素在不在数组/map/set中 目前用到的数据结构&#xff1a; std::unordered_set哈希表无序否否O(1)O(1) std::unordered_map哈希表key无序key不可重复key不可修改O(1)O(1) 1. 两数之和 - 力扣&#xff08;LeetCode&#xff09; 30min 几个问题 1.原来想…...

鸿蒙生态崛起的机遇有什么

鸿蒙生态系统的崛起为各个领域带来了多个机遇&#xff0c;主要体现在以下几个方面&#xff1a; 智能设备的互联互通&#xff1a;鸿蒙系统旨在实现不同设备之间的无缝连接&#xff0c;为物联网&#xff08;IoT&#xff09;设备的发展提供了良好的基础。这将推动智能家居、智慧城…...

写入json和读取json文件

/// <summary> ///写入文件 /// </summary> /// <param name"Stns"></param> /// <returns></returns> public ActionResult WriteJsonFile(string Stns) { strin…...

【Java基础入门篇】前言

Java基础入门篇 本系列内容主要针对Java基础知识&#xff0c;总共包含四大部分内容&#xff1a; 变量、数据类型和运算符控制语句和递归算法面向对象和JVM底层分析数组和排序 学习需要具备&#xff1a; IDEA编译器 JDK1.8版本 写在前面 在Java入门的最开始&#xff0c;我们需…...

LangChain——管道提示词 缓存

管道提示词 管道提示词可以将多个提示组合在一起。当我们想要使用部分提示时&#xff0c;这会很有用。这里可以通过PipelinePrompt来完成。 PipelinePrompt由两部分组成&#xff1a; 最终提示&#xff1a;返回的最终提示&#xff1b;管道提示&#xff1a;元组列表&#xff0c…...

LangGPT社区创始人云中江树:用热爱与坚持点燃实战营课堂

书生大模型实战营第 4 期正在火热进行中&#xff0c;在这里&#xff0c;我们见证了众多同学的成长与进步。今天&#xff0c;让我们一起走进第 4 期导师、结构化提示词 LangGPT 社区创始人云中江树的故事。他的故事不仅是对知识改变命运的生动诠释&#xff0c;更是一段关于热爱与…...

Admin.NET框架使用宝塔面板部署步骤

文章目录 Admin.NET框架使用宝塔面板部署步骤&#x1f381;框架介绍部署步骤1.Centos7 部署宝塔面板2.部署Admin.NET后端3.部署前端Web4.访问前端页面 Admin.NET框架使用宝塔面板部署步骤 &#x1f381;框架介绍 Admin.NET 是基于 .NET6 (Furion/SqlSugar) 实现的通用权限开发…...

18:(标准库)DMA二:DMA+串口收发数据

DMA串口收发数据 1、DMA串口发送数据2、DMA中断串口接收定长数据包3、串口空闲中断DMA接收不定长数据包4、串口空闲中断DMA接收不定长数据包DMA发送数据包 1、DMA串口发送数据 当串口的波特率大于115200时&#xff0c;可以通过DMA1进行数据搬运&#xff0c;以防止数据的丢失。如…...

Unity 导出 xcode 工程 并给 Info.plist 文件添加字段

Unity 导出 xcode 工程 并给 Info.plist 文件添加字段 在 Editor 文件夹下新建 xxx.cs 脚本 实现静态方法 [PostProcessBuild]public static void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject){// Unity 导出 Xcode 工程自动调用这个方法 }例子 一 us…...

打造高质量技术文档的关键要素(结合MATLAB)

在技术的浩瀚海洋中&#xff0c;一份优秀的技术文档宛如精准的航海图。它不仅是知识传承的载体&#xff0c;也是团队协作的桥梁&#xff0c;更是产品成功的幕后英雄。打造出色的技术文档并非易事&#xff0c;以下将从多个方向探讨如何做到这一点。 文章目录 方向一&#xff1a;…...

C语言-数组

数组的创建 数组结构式 数组类型 数组名称 数组大小 内容 列如 char Arr[3]{1,2,3} int Arr[3]{1,2,3} 注意&#xff1a;在C99之前&#xff0c;【】中需要一个常量才可以 数组的初始化 初始化就是给它赋值&#xff0c;初始化分为完全初始化和非完全初始化 完全初始化…...

hhdb数据库介绍(10-19)

监控 智能物理拓扑 物理拓扑图主要以服务器为视角展示集群组件与服务器的所属关系&#xff0c;同时可查看服务器资源的使用情况以及各集群组件服务运行状态。使用前需保证为集群服务器配置了可用的SSH连接信息&#xff0c;否则只能查看当前服务器与集群组件的所属关系&#x…...

AI开发:生成式对抗网络入门 模型训练和图像生成 -Python 机器学习

阶段1&#xff1a;GAN是个啥&#xff1f; 生成式对抗网络&#xff08;Generative Adversarial Networks, GAN&#xff09;&#xff0c;名字听着就有点“对抗”的意思&#xff0c;没错&#xff01;它其实是两个神经网络互相斗智斗勇的游戏&#xff1a; 生成器&#xff08;Gene…...

68 mysql 的 临键锁

前言 我们这里来说的就是 我们在 mysql 这边常见的 一种锁, 行临键锁 虽然 在平时我们用到的不是很多, 我们这里 主要是 讲一下 它的主要的触发的场景 行临键锁 等价于 行锁 间隙锁, 行间隙锁是一个 左开右开的区间, 行临键锁 是一个左开右闭的区间 但是 它 和 行锁的差异…...

(十一)Python3 接口自动化测试,Pytest-Allure报告的使用

(十一)Python3 接口自动化测试,Pytest-Allure报告的使用 1、安装和使用 1、安装pytest和allure-pytest插件: pip install pytest allure-pytest 2、在你的pytest测试用例中使用allure装饰器或者上下文管理器来生成报告。 例如,你可以使用@allure.feature装饰器来标记特性…...

【Rust 学习笔记】Rust 基础数据类型介绍(一)

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 博客内容主要围绕&#xff1a; 5G/6G协议讲解 高级C语言讲解 Rust语言讲解 文章目录 Rust 基础数据类型介绍&#xff08;一&#xff09;一、固定宽…...

深入理解Oracle DB的锁和闩

1. 引言 本文深入介绍Oracle DB的锁和闩。 2. Oracle DB 锁的基本概念 2.1 定义与作用 锁是 Oracle 数据库用于控制并发访问的一种机制。它用于防止多个事务同时对同一数据进行不一致的操作&#xff0c;确保数据的完整性和一致性。例如&#xff0c;当一个事务正在更新一行数…...

mcu上一种利用伪随机数防止mac地址冲突的方法

一 前言 前段时间开发的一个带tcp功能的项目&#xff0c;出现了mac地址冲突的问题&#xff0c;领导让随机生成一个mac地址&#xff0c;因此研究了下随机数。 二 预研 1.硬随机数 硬随机数又叫真随机数&#xff0c;英文名称”true random number generator“,即通过硬件随机数…...

C# 索引器(Indexer)

文章目录 前言一、索引器的语法规则二、索引器的用途及与属性的对比三、索引器的重载 前言 在 C# 编程中&#xff0c;索引器&#xff08;Indexer&#xff09;是一项极具特色且实用的语言特性&#xff0c;它赋予了对象一种独特的访问方式&#xff0c;使得对象能够如同数组一般&a…...

【大数据学习 | Spark-SQL】定义UDF和DUAF,UDTF函数

1. UDF函数&#xff08;用户自定义函数&#xff09; 一般指的是用户自己定义的单行函数。一进一出&#xff0c;函数接受的是一行中的一个或者多个字段值&#xff0c;返回一个值。比如MySQL中的&#xff0c;日期相关的dateDiff函数&#xff0c;字符串相关的substring函数。 先…...

Springboot集成通义大模型

1.先到阿里云平台开头阿里云白炼账号&#xff0c;创建apiKey 2. 引入maven依赖 <dependency><groupId>com.alibaba</groupId><artifactId>dashscope-sdk-java</artifactId><version>2.8.3</version></dependency><!-- htt…...

Xilinx PCIe高速接口入门实战(一)

引言&#xff1a;本文对Xilinx 7 Series Intergrated Block for PCI Express PCIe硬核IP进行简要介绍&#xff0c;主要包括7系列FPGA PCIe硬核资源支持、三IP硬核差异、PCIe硬核资源利用等相关内容。 1. 概述 1.1 7系列FPGA PCIe硬件资源支持 7系列FPGA对PCIe接口最大支持如…...

区块链游戏的新观察:自治世界能否成为未来链游的突破口?

区块链游戏&#xff08;链游&#xff09;作为加密领域的创新方向&#xff0c;一直被寄予厚望。然而&#xff0c;尽管各类链游层出不穷&#xff0c;大多只是靠代币激励一时爆火&#xff0c;缺乏持久吸引力。这种现象让人对链游未来的发展充满疑虑&#xff1a;是否有一种全新的设…...

Linq中的投影运算 (C#):Select、SelectMany、Zip

投影是指将对象转换为一种新形式的操作&#xff0c;该形式通常只包含那些将随后使用的属性。 通过使用投影&#xff0c;您可以构造从每个对象生成的新类型。 可以投影属性&#xff0c;并对该属性执行数学函数。 还可以在不更改原始对象的情况下投影该对象。 1、Select 下面的…...

GPU 服务器厂家:怎样铸就卓越 AI 算力?

文章来源于百家号&#xff1a;GPU服务器厂家 今天咱来聊聊 GPU 服务器厂家那些事儿&#xff0c;而这其中衡量 AI 算力的因素可是关键所在哦。 先讲讲计算速度这一块。咱都知道 AI 那复杂的活儿&#xff0c;像训练超厉害的图像识别模型&#xff0c;得处理海量图像数据&#x…...

数据结构与算法——N叉树(自学笔记)

本文参考 N 叉树 - LeetBook - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台 遍历 前序遍历&#xff1a;A->B->C->E->F->D->G后序遍历&#xff1a;B->E->F->C->G->D->A层序遍历&#xff1a;A->B->C->D->…...

浏览器的数据六种存储方法比较 :LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite

在构建该 Web 应用程序&#xff0c;并且希望将数据存储在用户浏览器中。也许您只需要存储一些小标志&#xff0c;或者甚至需要一个成熟的数据库。 我们构建的 Web 应用程序类型发生了显着变化。在网络发展的早期&#xff0c;我们提供静态 html 文件。然后我们提供动态渲染的 h…...

Rust个人认为将抢占C和C++市场,逐渐成为主流的开发语言

本人使用C开发8年、C#开发15年、中间使用JAVA开发过项目、后期在学习过程中发现了Rust语言说它是最安全的语言&#xff0c;能够解决C、C的痛点、于是抽出一部分时间网上买书&#xff0c;看网上资料进行学习&#xff0c;这一学习起来发现和其它语言比较起来&#xff0c;在编码的…...

electron-updater软件自动检测更新 +无服务器本地测试

大家好&#xff0c;我是小黄。 今天分享一下如何0基础实现electron自动检测更新功能。 一. 安装 electron-updater 实现自动更新 安装依赖 electron-updater npm install electron-updater 二. 修改package.josn "publish": {"provider": "generi…...

Flink在Linux系统上的安装与入门

一、Flink的引入 这几年大数据的飞速发展&#xff0c;出现了很多热门的开源社区&#xff0c;其中著名的有Hadoop、Storm&#xff0c;以及后来的Spark&#xff0c;他们都有着各自专注的应用场景。Spark 掀开了内存计算的先河&#xff0c;也以内存为赌注&#xff0c;赢得了内存计…...

鸿蒙面试---都用过哪些装饰器

必答的 State装饰器&#xff1a;组件内状态 State装饰的变量&#xff0c;或称为状态变量&#xff0c;一旦变量拥有了状态属性&#xff0c;就可以触发其直接绑定UI组件的刷新。当状态改变时&#xff0c;UI会发生对应的渲染改变。Prop装饰器&#xff1a;父子单向同步Prop装饰的变…...

微信小游戏/抖音小游戏SDK接入踩坑记录

文章目录 前言问题记录1、用是否存在 wx 这个 API 来判断是微小平台还是抖小平台不生效2、微小支付的参数如何获取?3、iOS 平台不支持虚拟支付怎么办?微小 iOS 端支付时序图:抖小 iOS 端支付:4、展示广告时多次回调 onClose5、在使用单例时 this 引起的 bug6、使用 fetch 或…...

uniapp配置全局消息提醒

1.H5使用根标签插入dom的方式实现。 2.app端使用plus.nativeObj.View的方式绘制实现 H5端app端 H5端 创建组件orderAlert.vue <template><div class"view"><div class"content" v-if"visible"><div class"message&q…...

Docker学习

&#x1f389;Docker 简介和安装 Docker 是什么 Docker 是一个应用打包、分发、部署的工具 你也可以把它理解为一个轻量的虚拟机&#xff0c;它只虚拟你软件需要的运行环境&#xff0c;多余的一点都不要&#xff0c; 而普通虚拟机则是一个完整而庞大的系统&#xff0c;包含各…...

【Electron学习笔记(三)】Electron的主进程和渲染进程

Electron的主进程和渲染进程 Electron的主进程和渲染进程前言正文1、主进程2、渲染进程3、Preload 脚本3.1 在项目目录下创建 preload.js 文件3.2 在 main.js 文件下创建路径变量并将 preload.js 定义为桥梁3.3 在 preload.js 文件下使用 electron 提供的contextBridge 模块3.4…...

人工智能的微积分基础

目录 ​编辑 引言 微积分的基本概念 1. 导数 2. 积分 3. 微分方程 微积分在人工智能中的应用 1. 机器学习中的优化 2. 反向传播算法 3. 概率与统计 4. 控制理论 5. 自然语言处理中的梯度 6. 计算机视觉中的积分 7. 优化算法中的微积分 8. 微分几何在深度学习中的…...

关于BeanUtils.copyProperties是否能正常复制字段【详细版】

话不多说&#xff01;先总结&#xff1a; 1、字段相同&#xff0c;类型不同&#xff08;不复制&#xff0c;也不报错&#xff09; 2、子类父类 (1)子类传给父类&#xff08;可以正常复制&#xff09; (2)父类传给子类&#xff08;可以正常复制&#xff09; 3、子类父类&#x…...

oracle将select作为字段查询

在Oracle中&#xff0c;如果你想将一个SELECT语句作为字段的值&#xff0c;你可以使用子查询或者使用WITH子句&#xff08;也称为公用表表达式CTE&#xff09;。以下是两种方法的示例&#xff1a; 方法1&#xff1a;使用子查询 语法如下&#xff1a; SELECTcolumn1,(SELECT …...

FFmpeg 简介与编译

1. ffmpeg 简介&#xff1a; FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec&#xff0c;为了保证高可移…...

qt QLinearGradient详解

1、概述 QLinearGradient是Qt框架中QGradient的一个子类&#xff0c;用于创建线性渐变效果。线性渐变是一种颜色沿着一条直线平滑过渡到另一种颜色的效果。QLinearGradient允许你定义渐变的起点和终点&#xff0c;以及在这些点之间的颜色变化。你可以使用它来为图形、背景、边…...

点击A组件跳转到B页面的tab的某一列

1、使用vuex存储点击的数据&#xff1b; 点击A组件里面的button按钮&#xff1a; <div><button click"banli(first)">已办理</button><button click"banli(second)">未办理</button><button click"banli(third)&quo…...

图像小波去噪与总变分去噪详解与Python实现

目录 图像小波去噪与总变分去噪详解与实现1. 基础概念1.1 噪声类型及去噪问题定义1.2 小波去噪算法基础1.3 总变分去噪算法基础2. 小波去噪算法2.1 理论介绍2.2 Python实现及代码详解2.3 案例分析3. 总变分去噪算法3.1 理论介绍3.2 Python实现及代码详解3.3 案例分析4. 两种算法…...

mvn-mac操作小记

1.安装brew 如果报错&#xff0c;Warning: /opt/homebrew/bin is not in your PATH. vim ~/.zshrc&#xff0c;最后一行追加 export PATH“/opt/homebrew/bin:$PATH” source ~/.zshrc 2.安装brew install maven mvn -version查看路径 Maven home: /opt/homebrew/Cellar/mav…...

【娱乐项目】基于批处理脚本与JavaScript渲染视频列表的Web页面

Demo介绍 一个简单的视频播放器应用&#xff0c;其中包含了视频列表和一个视频播放区域。用户可以通过点击视频列表中的项来选择并播放相应的视频&#xff0c;播放器会自动播放每个视频并在播放完毕后切换到下一个视频。本项目旨在通过自动化脚本和动态网页渲染&#xff0c;帮助…...

Faster R-CNN (目标检测)

Faster R-CNN (Faster Region-based Convolutional Neural Networks) Faster R-CNN 是一种高效的目标检测模型&#xff0c;它是在 R-CNN 系列&#xff08;包括 R-CNN 和 Fast R-CNN&#xff09;的基础上发展而来的&#xff0c;能够实现对图像中多个对象的检测。Faster R-CNN 引…...

Diffusion中的Unet (DIMP)

针对UNet2DConditionModel模型 查看Unet的源码&#xff0c;得知Unet的down,mid,up blocks的类型分别是&#xff1a; down_block_types: Tuple[str] ("CrossAttnDownBlock2D","CrossAttnDownBlock2D","CrossAttnDownBlock2D","DownBlock2…...