密码学基石:哈希、对称/非对称加密与HTTPS实践详解
密码学是现代信息安全的基石,它提供了一系列强大的数学工具和技术,用于保护数据的机密性、完整性和真实性,并确保通信双方的身份可被认证。在纷繁复杂的网络世界中,无论是安全的网页浏览 (HTTPS)、安全的软件更新、还是用户密码的存储,都离不开密码学的支撑。
一、哈希函数 (Hash Functions):数据的"数字指纹"
哈希函数是一种能将任意长度的输入数据(也称为"消息"或"原文")通过一个确定性的算法,转换成一个固定长度的输出字符串(称为"哈希值"、"消息摘要"或"数字指纹")的函数。
核心特性:
- 确定性 (Deterministic):相同的输入总是产生相同的哈希值。
- 快速计算 (Fast to Compute):对于任意给定的输入,计算其哈希值都应该非常迅速。
- 单向性/不可逆性 (Pre-image Resistance):从哈希值几乎不可能(计算上不可行)反向推导出原始输入数据。就像你很难从指纹反推出完整的人一样。
- 弱抗碰撞性 (Second Pre-image Resistance):对于一个给定的输入,找到另一个不同的输入,使得两者具有相同的哈希值,应该是计算上不可行的。
- 强抗碰撞性 (Collision Resistance):找到任意两个不同的输入,使得它们具有相同的哈希值,应该是计算上不可行的。
- 雪崩效应 (Avalanche Effect):原始输入数据即使发生极微小的改变(例如,只改变一个比特),其生成的哈希值也会发生巨大的、不可预测的变化。
常见应用场景:
- 数据完整性校验:下载文件后,计算其哈希值并与官方提供的哈希值对比,可以验证文件在传输过程中是否被篡改。
- 密码存储:存储用户密码的哈希值而不是明文密码,即使数据库泄露,攻击者也无法直接获取用户密码。
- 数字签名:对消息的哈希值进行签名,而不是对整个消息签名,可以提高效率。
- 数据索引与查找:哈希表(Hash Table)的实现基础。
MD5 vs SHA-256:安全性的演进
-
MD5 (Message Digest Algorithm 5):
- 产生一个 128 位(16字节)的哈希值。
- MD5 在早期被广泛使用,但由于王小云教授等人的研究,其强抗碰撞性已被攻破。这意味着可以相对容易地找到两个不同的输入产生相同的 MD5 哈希值。
- 因此,MD5 不再被认为是安全的,绝对不应用于密码存储、数字签名或任何对安全性要求较高的场景。
-
SHA-256 (Secure Hash Algorithm 256-bit):
- 属于 SHA-2 (Secure Hash Algorithm 2) 家族的一员,产生一个 256 位(32字节)的哈希值。
- 截至目前,SHA-256 仍然被认为是安全的,具有良好的抗碰撞性。
- 是目前密码存储、数字签名、区块链技术(如比特币)等安全应用中的推荐选择。
密码存储最佳实践:加盐哈希 (Salted Hashing)
仅仅对密码进行哈希(即使是 SHA-256)仍然不够安全,因为它无法抵御"彩虹表攻击" (Rainbow Table Attack)。彩虹表是预先计算好的常见密码与其哈希值的对应表,攻击者拿到哈希后的密码库后,可以通过查表快速破解那些使用了常见密码的账户。
"加盐" (Salting) 是解决此问题的关键:
- 什么是盐 (Salt)? 盐是一个为每个用户密码独立生成的、足够长的随机字符串。
- 如何工作?
- 当用户创建或修改密码时,系统为其生成一个唯一的盐。
- 将用户的明文密码和这个盐拼接起来(或者以其他方式组合)。
- 对拼接后的字符串使用安全的哈希函数(如 SHA-256 或更强的 bcrypt, scrypt, Argon2)计算哈希值。
- 将计算得到的哈希值和盐本身一起存储在数据库中。盐不需要保密,但必须与对应的密码哈希一起存储。
- 验证过程:
- 当用户尝试登录时,系统从数据库中根据用户名取出对应的盐和存储的哈希值。
- 将用户输入的密码和取出的盐进行相同的拼接操作。
- 对拼接后的结果使用相同的哈希函数计算新的哈希值。
- 比较新计算的哈希值与数据库中存储的哈希值是否一致。如果一致,则密码正确。
加盐的好处:
- 抵御彩虹表攻击:由于每个用户的盐都是不同的,即使两个用户使用了相同的密码,他们存储的哈希值也会因为盐的不同而不同。攻击者无法为所有可能的盐和密码组合预先计算彩虹表。
- 增加破解难度:攻击者即使获取了数据库,也必须对每个用户的哈希值进行单独的暴力破解或字典攻击,因为每个哈希都包含了唯一的盐。
更强的密码哈希算法:
对于密码存储,除了 SHA-256,更推荐使用专门为密码哈希设计的算法,如 bcrypt, scrypt, Argon2 (Argon2id 是 Argon2 的推荐变体,也是密码哈希竞赛的获胜者)。这些算法的特点是:
- 计算缓慢 (Computationally Intensive):它们被设计成故意消耗较多的 CPU 和/或内存资源,使得暴力破解的成本极高,即使使用专用硬件(如 GPU、ASIC)也难以快速破解。
- 可配置的工作因子 (Work Factor / Cost Factor):可以调整算法的计算成本,随着计算硬件的进步,可以增加工作因子以保持安全性。
二、对称加密 (Symmetric Encryption):共享密钥的艺术
对称加密是指在加密和解密数据时使用相同的密钥的加密算法。
工作原理:
- 发送方使用一个共享密钥将明文数据加密成密文。
- 接收方使用完全相同的共享密钥将密文解密回明文。
常用算法:
- AES (Advanced Encryption Standard):目前最流行和广泛使用的对称加密算法。它是一种分组密码,支持 128位、192位、256位长度的密钥,安全性高,性能好。已被美国政府采纳为标准,并在全球范围内广泛应用。
- DES (Data Encryption Standard):较早的对称加密标准,密钥长度为 56位,已被认为不安全,容易被暴力破解。
- 3DES (Triple DES):通过对数据执行三次 DES 来增强安全性,但效率较低,正逐渐被 AES 取代。
优点:
- 加解密速度快:相比非对称加密,对称加密的计算效率通常要高得多,适合加密大量数据。
缺点:
- 密钥分发困难 (Key Distribution Problem):在通信双方开始加密通信之前,必须找到一种安全的方式将共享密钥传递给对方。如果密钥在传输过程中被窃取,那么整个加密通信的安全性就荡然无存。这是对称加密面临的最大挑战。
- 密钥管理复杂:在多方通信的场景下,每对通信方都需要一个独立的共享密钥,导致密钥数量急剧增加,管理困难。
三、非对称加密 (Asymmetric Encryption):公私钥的魔法
非对称加密,也称为公钥加密 (Public-key Cryptography),是指在加密和解密数据时使用一对不同的密钥:一个公钥 (Public Key) 和一个私钥 (Private Key)。
密钥对特性:
- 公钥是公开的,任何人都可以获取。
- 私钥由所有者严格保密,绝不能泄露。
- 用公钥加密的数据,只能用其对应的私钥才能解密。
- 用私钥加密(通常称为"签名")的数据,可以用其对应的公钥来验证(解密)。
- 从公钥几乎不可能(计算上不可行)推导出私钥。
工作原理(用于加密通信):
- 接收方 Bob 生成一对公私钥,并将公钥发布出去(例如,发送给发送方 Alice,或存放在公共的密钥服务器上)。Bob 自己保管私钥。
- 发送方 Alice 想要向 Bob 发送机密信息。她使用 Bob 的公钥将明文数据加密成密文。
- Alice 将密文发送给 Bob。
- Bob 收到密文后,使用他自己的私钥进行解密,得到原始明文。
由于只有 Bob 持有对应的私钥,所以即使密文在传输过程中被第三方截获,只要 Bob 的私钥没有泄露,第三方也无法解密密文。
常用算法:
- RSA (Rivest-Shamir-Adleman):基于大整数因子分解难题,是目前应用最广泛的非对称加密算法。可用于加密和数字签名。
- ECC (Elliptic Curve Cryptography,椭圆曲线密码学):基于椭圆曲线离散对数难题。与 RSA 相比,ECC 可以用更短的密钥长度达到同等的安全强度,因此在资源受限的设备(如移动设备、IoT设备)上更具优势,密钥生成和签名速度也更快。
- Diffie-Hellman 密钥交换:严格来说它是一个密钥协商协议,而不是直接的加密算法,它允许双方在不安全的信道上安全地协商出一个共享密钥,用于后续的对称加密通信。
优点:
- 解决了密钥分发问题:发送方只需要获取接收方的公钥即可加密数据,无需事先安全地交换共享密钥。
- 可用于数字签名:私钥持有者可以用私钥对数据进行签名,任何人都可以用其公钥验证签名的真实性和数据的完整性(详见数字签名部分)。
缺点:
- 加解密速度慢:相比对称加密,非对称加密的计算复杂度要高得多,不适合加密大量数据。
四、HTTPS 实践:对称与非对称加密的完美结合
HTTPS (Hypertext Transfer Protocol Secure) 是在不安全的 HTTP 协议基础上,通过结合 SSL/TLS (Secure Sockets Layer / Transport Layer Security) 协议来实现的安全网页浏览。SSL/TLS 巧妙地利用了对称加密和非对称加密的各自优点,实现了既安全又高效的通信。
HTTPS 的主要目标:
- 机密性 (Confidentiality):对浏览器和服务器之间的通信数据进行加密,防止被窃听。
- 完整性 (Integrity):确保数据在传输过程中没有被篡改。
- 身份认证 (Authentication):验证网站服务器的真实身份,防止用户访问到仿冒的钓鱼网站 (通过 SSL/TLS 证书实现)。
HTTPS (SSL/TLS) 握手过程简述 (以 RSA 密钥交换为例):
-
客户端问候 (Client Hello):浏览器(客户端)向服务器发送一个 "Client Hello" 消息,包含:
- 客户端支持的 SSL/TLS 版本号。
- 一个客户端生成的随机数 (Client Random)。
- 客户端支持的加密套件列表 (Cipher Suites,指明了对称加密算法、密钥交换算法、消息认证码算法等)。
- 客户端支持的压缩方法列表。
-
服务器响应 (Server Hello & Certificate & Server Key Exchange & Server Hello Done):服务器从客户端提供的加密套件中选择一套双方都支持的,并向客户端发送:
- "Server Hello" 消息,包含:
- 服务器选择的 SSL/TLS 版本号。
- 一个服务器生成的随机数 (Server Random)。
- 服务器选择的加密套件。
- 服务器选择的压缩方法。
- 服务器证书 (Certificate):服务器将其 SSL/TLS 证书(其中包含服务器的公钥,并由受信任的 CA 签名)发送给客户端。客户端会验证该证书的有效性(是否由可信 CA 签发、是否过期、域名是否匹配等)。
- (可选) Server Key Exchange:如果证书中的公钥不足以进行密钥交换(例如,使用的是仅用于签名的 DSS 证书,或者需要进行临时的 Diffie-Hellman 密钥交换),服务器会发送此消息,包含进行密钥交换所需的额外参数。
- "Server Hello Done" 消息:告知客户端,服务器的初始协商消息已发送完毕。
- "Server Hello" 消息,包含:
-
客户端密钥交换与验证 (Client Key Exchange & Change Cipher Spec & Encrypted Handshake Message):
- 客户端验证服务器证书通过后,会生成另一个随机数,称为 "Pre-Master Secret"。
- Client Key Exchange:客户端使用服务器证书中的公钥将这个 "Pre-Master Secret" 加密后发送给服务器。
- 客户端和服务器现在都拥有了三个随机数:Client Random, Server Random, Pre-Master Secret。双方使用这三个随机数,通过一个预定义的伪随机函数 (PRF) 生成一个主密钥 (Master Secret)。然后,再从主密钥派生出会话密钥 (Session Keys),包括用于对称加密的密钥、用于消息认证码 (MAC) 的密钥等。
- Change Cipher Spec:客户端通知服务器,从现在开始,后续的通信将使用协商好的会话密钥进行加密。
- Encrypted Handshake Message (Finished):客户端将之前所有握手消息的哈希值用协商好的会话密钥加密后发送给服务器,供服务器校验握手过程的完整性。
-
服务器完成握手 (Change Cipher Spec & Encrypted Handshake Message):
- 服务器使用自己的私钥解密客户端发送过来的加密的 "Pre-Master Secret"。然后执行与客户端相同的步骤生成主密钥和会话密钥。
- Change Cipher Spec:服务器通知客户端,它也将开始使用协商好的会话密钥进行加密通信。
- Encrypted Handshake Message (Finished):服务器也将之前所有握手消息的哈希值用协商好的会话密钥加密后发送给客户端,供客户端校验。
-
安全通信开始:如果双方都成功验证了对方的 "Finished" 消息,则 SSL/TLS 握手完成。后续的应用层数据(HTTP 请求和响应)都将使用协商好的对称加密算法和会话密钥进行加密传输,并使用消息认证码确保完整性。
总结 HTTPS 中的密码学应用:
- 非对称加密 (如 RSA):主要用于 SSL/TLS 握手阶段,安全地交换 Pre-Master Secret(或者用于服务器身份认证和密钥协商参数的签名)。它解决了对称加密密钥分发的难题。
- 对称加密 (如 AES):用于 SSL/TLS 握手完成后的实际应用数据加密。它提供了高效的数据加密能力。
- 哈希函数 (如 SHA-256):用于生成数字证书中的指纹、验证消息完整性 (HMAC)、生成密钥等。
- 数字证书与 PKI (公钥基础设施):用于验证服务器身份的真实性。
通过这种混合加密方式,HTTPS 兼顾了安全性和效率,为我们的在线活动提供了坚实的保护。
五、总结:密码学——数字世界的守护神
哈希函数、对称加密和非对称加密是密码学中三类基本且至关重要的工具。它们各自拥有独特的特性和应用场景,并通过巧妙的组合(如 HTTPS)共同构筑了我们数字世界的安全防线。
理解这些密码学概念的原理和应用,不仅对于安全专业人士至关重要,对于每一位软件开发者和希望安全畅游互联网的用户来说,也都是非常有益的。随着技术的发展,新的加密算法和安全协议会不断涌现,但这些基础的密码学思想将持续发挥其核心作用。
相关文章:
密码学基石:哈希、对称/非对称加密与HTTPS实践详解
密码学是现代信息安全的基石,它提供了一系列强大的数学工具和技术,用于保护数据的机密性、完整性和真实性,并确保通信双方的身份可被认证。在纷繁复杂的网络世界中,无论是安全的网页浏览 (HTTPS)、安全的软件更新、还是用户密码的…...
WebRTC通信原理与流程
1、服务器与协议相关 1.1 STUN服务器 图1.1.1 STUN服务器在通信中的位置图 1.1.1 STUN服务简介 STUN(Session Traversal Utilities for NAT,NAT会话穿越应用程序)是一种网络协议,它允许位于NAT(或多重 NAT)…...
ChromaDB调用BGE模型的两种实践方式
ChromaDB调用BGE模型 前言1.chromadb调用BGE模型api2.调用本地模型 前言 在语义搜索、知识库构建等场景中,文本向量化(Embedding)是核心技术环节。作为一款开源的向量数据库,ChromaDB允许开发者通过自定义嵌入函数灵活对接各类模…...
解构与重构:自动化测试框架的进阶认知之旅
目录 一、自动化测试的介绍 (一)自动化测试的起源与发展 (二)自动化测试的定义与目标 (三)自动化测试的适用场景 二、什么是自动化测试框架 (一)自动化测试框架的定义 &#x…...
如何巧妙解决 Too many connections 报错?
1. 背景 在日常的 MySQL 运维中,难免会出现参数设置不合理,导致 MySQL 在使用过程中出现各种各样的问题。 今天,我们就来讲解一下 MySQL 运维中一种常见的问题:最大连接数设置不合理,一旦到了业务高峰期就会出现连接…...
【卡特兰数】不同的二叉搜索树
文章目录 96. 不同的二叉搜索树解法一:动态规划状态表示状态转移方程初始化遍历顺序返回值💥解法二:卡特兰数96. 不同的二叉搜索树 96. 不同的二叉搜索树 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉…...
《饶议科学》阅读笔记
《饶议科学》 《偷窃的生物学机制:(有些)小偷有药可治》阅读笔记 核心内容:探讨偷窃狂(kleptomania)的生物学机制及相关研究。具体要点 偷窃狂的特征:患者不可抑制地反复偷窃个人不需要、与金钱…...
ShardingJdbc-公共表
ShardingJdbc-公共表 公共表 公共表属于系统中数据量小,变动少,但是却高频联合查询的表,参数表,字典表等属于此类型。可以将此类表在每个数据库中存储一份,所有更新操作将同时发送到所有分库执行。 案例 建立库 shar…...
低成本监控IPC模组概述
1、低成本sigmastar ssc335\ssc377摄像机方案,配合AI边缘计算终端即插即用,差异化AI训练及样 本采集 2、支持200万、500万H265\H264视频编码,支持网络Rtsp,Rtmp,Onvif,web,GB28181,tf卡本地录像, 视频平台接入等...
携手高校科研团队,共建TWS耳机芯片技术新生态
TWS(真无线立体声)蓝牙耳机已成为人们生活中不可或缺的一部分。而在这背后,有一家名为华芯邦的公司,其专注于TWS蓝牙仓耳机芯片的研发,并不断取得令人瞩目的突破。 一、芯片领域的实力玩家 华芯邦作为一家在芯片行业崭…...
动态规划-91.解码方法-力扣(LeetCode)
一、题目解析 将对应字符转化为数字,我们知道有的大写字母范围是在[1,9],剩下的则是[10,26],这个对应关系使我们解题的关键。 二、算法原理 1.状态表示 dp[i]表示:以i位置为结尾时,解码方法总…...
(三)Java数据类型与进制详解
一、Java数据类型概述 Java是一种强类型语言,这意味着每个变量和表达式在编译时都必须有明确的类型。Java的数据类型系统是其核心基础之一,它决定了如何存储数据、能存储什么样的数据以及能对数据执行哪些操作。 1.1 为什么需要数据类型 数据类型在编…...
用 CodyBuddy 帮我写自动化运维脚本
我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴”。 #CodeBuddy首席试玩官 背景 我个人是非常喜欢 Jenkins 自动化部署工具的,之前都是手写 Jenki…...
【Linux庖丁解牛】—程序地址空间【进程地址空间 | 虚拟地址空间】
1. 再谈空间分布图 我们之前在学C/C的时候必然学过上面的空间分布图。 可是我们对他并不理解!这里先对其进行各区域分布验证: #include <stdio.h> #include <unistd.h> #include <stdlib.h> int g_unval; int g_val 100; int ma…...
nginx 上传文件,413 request entity too large
目录 1 问题2 解决 1 问题 前端后端项目,上传文件,接口没问题,但是就是上传不成功 ,然后打开f12 ,发现这个接口出现413 request entity too large 这个报错 2 解决 1.1 修改nginx配置文件 在Nginx中,cli…...
Nacos源码—5.Nacos配置中心实现分析二
大纲 1.关于Nacos配置中心的几个问题 2.Nacos如何整合SpringBoot读取远程配置 3.Nacos加载读取远程配置数据的源码分析 4.客户端如何感知远程配置数据的变更 5.集群架构下节点间如何同步配置数据 4.客户端如何感知远程配置数据的变更 (1)ConfigService对象使用介绍 (2)客…...
数智管理学(八)
四、未来管理学可能的新拓展方向 (一)人工智能与机器学习的融合形成智能决策管理职能 随着人工智能和机器学习技术的不断发展,它们将在管理学中得到更广泛的应用。传统决策方法难以快速处理海量数据并准确把握复杂的市场动态。人工智能与机…...
Compose Multiplatform iOS 稳定版发布:可用于生产环境,并支持 hotload
随着 Compose Multiplatform 1.8.0 的发布,iOS 版本也引来的第一个稳定版本,按照官方的原话:「iOS Is Stable and Production-Ready」 ,而 1.8.0 版本,也让 Kotlin 和 Compose 在移动端有了完整的支持。 在 2023 年 4 …...
spark基本介绍
一、Spark概述 Spark是一种基于内存的快速、通用、可拓展的大数据分析计算引擎。 Hadoop是一个分布式系统结构的基础架构。 二、Spark与Hadoop相比较的优势: 1. 处理速度:Hadoop:数据处理速度相对较慢 Spark:速度比Hadoop快很…...
DeepSeek智能时空数据分析(九):NL2SQL绘制河流名字-如何给轨迹添加说明文字
序言:时空数据分析很有用,但是GIS/时空数据库技术门槛太高 时空数据分析在优化业务运营中至关重要,然而,三大挑战仍制约其发展:技术门槛高,需融合GIS理论、SQL开发与时空数据库等多领域知识;空…...
管家婆实用贴-如何在Excel中清除空格
我们在使用管家婆软件时,经常会用到Excel表格导入导出数据,在使用Excel整理数据时,数据中的空格可能会导致计算和分析出现问题。无论是多余的前导空格、尾部空格还是单元格中的不必要空格,清除它们都是确保数据准确性的关键。今天…...
《软件项目管理》笔记一
软件项目管理概述 项目管理属于软件工程的组成之一,另外两部分为:软件开发,过程改进。 参考书如下: 1.1 项目与软件项目 1、项目: 为了创造一个唯一的产品或提供一个唯一的服务而进行 的临时性的努力。 2、项目的…...
前端线上错误日志收集与定位指南
想象一下:你的Web应用上线后,用户反馈“按钮点不动”或“页面白屏”,但你却无从下手!前端线上错误如JavaScript异常、网络失败,稍不注意就让用户流失,业务受损。令人抓狂的是,80%的错误悄无声息…...
可视化魔法指南
🎨 ECharts数据可视化魔法指南 🌟 ECharts:数据的艺术画笔 #mermaid-svg-ARwFHUrXBJ03Gpo9 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ARwFHUrXBJ03Gpo9 .error-icon{fill:#552222;}#mermaid-svg-ARwFHUr…...
使用ffmpeg截取MP3等音频片段
可以使用以下命令通过 ffmpeg 截取 MP3 音频文件的指定片段: ffmpeg的安装方法参考:linux 安装包方式安装ffmpeg,并在环境中设定或指定ffmpeg地址_linux 通过ffmpeg访问地址-CSDN博客 ffmpeg -ss [start_time] -i input.mp3 -to [end_time] -codec copy output.mp3 参数说…...
FFmpeg(7.1版本)编译生成ffplay
FFmpeg在编译的时候,没有生成ffplay,怎么办? 1. 按照上一篇文章:FFmpeg(7.1版本)在Ubuntu18.04上的编译_ffmpeg-7.1-CSDN博客 在build.sh脚本里配置了ffplay 但是,实际上却没有生成ffplay,会是什么原因呢? 2. 原因是编译ffplay的时候,需要一些依赖库 sudo apt-get i…...
CAN学习之--不使用收发器进行通讯测试
在实际调试或者学习CAN通讯过程中,在需要进行CAN调试的时候,但是手头有只有MCU的评估板,没有CAN的收发器,比如ATA6561、MCP2518这类芯片的时候,该怎么办呢? 因为我们知道,CAN收发器只是做信号的…...
律所项目管理全攻略:人力分配 / 案件管控 / 知识沉淀三维度解析(附专用工具清单)
引言:律所项目管理破局 ——从经验驱动到体系化运营 在法律服务行业数字化转型加速的背景下,律所项目管理能力已成为决定服务质量、客户满意度及团队效能的核心竞争力。从人力分配失衡导致的效率损耗,到案件流程模糊引发的客户信任危机&…...
Linux电源管理(7)_Wakeup events framework
原文链接:Linux电源管理(7)_Wakeup events framework 1. 前言 本文继续“Linux电源管理(6)_Generic PM之Suspend功能”中有关suspend同步以及PM wakeup的话题。这个话题,是近几年Linux kernel最具争议的话题之一,在国外Linux开发论坛&…...
Nvidia-smi 运行失败(Failed to initialize NVML: Driver/library version mismatch)
问题排查 在linux服务器上运行 nvidia-smi 命令,提示以下错误: Failed to initialize NVML: Driver/library version mismatch 首先查看内核驱动版本: cat /proc/driver/nvidia/version然后查看当前NVIDIA驱动版本: sudo dpkg …...
算法设计与分析实验题-序列对齐
基于 C 的序列最大对齐得分算法实现 在生物信息学和文本处理领域,序列对齐是一种常见的需求。本文将介绍如何使用 C 实现一个序列最大对齐得分算法,该算法可以计算两个序列在最优对齐方式下的最大得分。 问题描述 给定两个序列 S1 和 S2,我…...
第8章-1 查询性能优化-优化数据访问
上一篇:《 下一篇:《第7章-3 维护索引和表》》 在前面的章节中,我们介绍了如何设计最优的库表结构、如何建立最好的索引,这些对于提高性能来说是必不可少的。但这些还不够——还需要合理地设计查询。如果查询写得很糟糕&a…...
每日一题洛谷P1025 [NOIP 2001 提高组] 数的划分c++
P1025 [NOIP 2001 提高组] 数的划分 - 洛谷 (luogu.com.cn) #include<iostream> using namespace std; int n, k; int res 0; void dfs(int num,int step,int sum) {//判断if (sum n) {if (step k) {res;return;}}if (sum > n || step k)return;//搜索for (int i …...
【python】使用Python和BERT进行文本摘要:从数据预处理到模型训练与生成
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着信息爆炸时代的到来,海量文本数据的高效处理与理解成为亟待解决的问题。文本摘要作为自然语言处理(NLP)中的关键任务,旨在自动生成…...
WHAT - Rust 智能指针
文章目录 常见的智能指针类型1. Box<T> — 堆上分配的数据2. Rc<T> — 引用计数的共享所有权(单线程)3. Arc<T> — 原子引用计数(多线程)4. RefCell<T> — 运行时可变借用(单线程)…...
用go从零构建写一个RPC(仿gRPC,tRPC)--- 版本1(Client端)
这里我们来实现这个RPC的client端 为了实现RPC的效果,我们调用的Hello方法,即server端的方法,应该是由代理来调用,让proxy里面封装网络请求,消息的发送和接受处理。而上一篇文章提到的服务端的代理已经在.rpc.go文件中…...
CentOS 安装 Zellij 终端复用器教程
CentOS 安装 Zellij 终端复用器教程 简介 Zellij 是一个现代化的终端复用器,使用 Rust 语言编写。它提供了类似 tmux 的功能,但具有更友好的用户界面和更现代化的特性。本教程将详细介绍如何在 CentOS 7.9 系统上安装 Zellij。 前置条件 CentOS 7.9 …...
基于 SpringBoot + Vue 的校园管理系统设计与实现
一、项目简介 本系统以校园组织管理为主线,结合用户权限分离机制与模块化设计,实现对“单位类别、单位、通知推送、投票信息、用户回复”等内容的全流程管理,广泛适用于教育局、高校及下属组织的信息管理工作。 🎯 项目亮点&…...
如何减少锁竞争并细化锁粒度以提高 Rust 多线程程序的性能?
在并发编程中,锁(Lock)是一种常用的同步机制,用于保护共享数据免受多个线程同时访问造成的竞态条件(Race Condition)。然而,不合理的锁使用会导致严重的性能瓶颈,特别是在高并发场景…...
【人工智能agent】--dify通过mcp协议调用工具
MCP Client 发起工具调用的实体,也就是 Dify 工作流或 Agent。它通过 Dify 平台提供的标准化接口(工具节点)来请求服务。 MCP Server / Host 提供实际服务的端点。在这个例子中,就是模拟 API 服务器 上的各个API (/api/pump/st…...
Review --- Redis
Redis redis是什么? Redis是一个开源的,使用C语言编写的,支持网络交互的,key-value数据结构存储系统,支持多种语言的一种非关系型数据库,它可以用作数据库(存储一些简单的数据,例如新闻点赞量),**缓存(秒…...
Sql刷题日志(day8)
一、笔试 1、right:提取字符串右侧指定数量的字符 right(string,length) /*string:要操作的字符串。length:要从右侧提取的字符数 */ 2、curdate():返回当前日期,格式通常为 YYYY-MM-DD 二、面试 1、自变量是不良体验反馈,因…...
【Science Advances】普林斯顿大学利用非相干光打造可重构纳米光子神经网络
(导读 ) 人工智能对计算性能需求剧增,电子微处理器发展受功耗限制。光学计算有望解决这些问题,光学神经网络(ONNs)成为研究热点,但现有 ONNs 因设计缺陷,在图像分类任务中精度远低于现代电子神经网络&#…...
2025-05-07 Unity 网络基础8——UDP同步异步通信
文章目录 1 UDP 概述1.1 通信流程1.2 TCP 与 UDP1.3 UDP 分包1.4 UDP 黏包 2 同步通信2.1 服务端2.2 客户端2.3 测试 3 异步通信3.1 Bgin / End 方法3.2 Async 方法 1 UDP 概述 1.1 通信流程 客户端和服务端的流程如下: 创建套接字 Socket。用 Bind() 方法将套…...
K8S - 金丝雀发布实战 - Argo Rollouts 流量控制解析
一、金丝雀发布概述 1.1 什么是金丝雀发布? 金丝雀发布(Canary Release)是一种渐进式部署策略,通过逐步将生产流量从旧版本迁移至新版本,结合实时指标验证,在最小化风险的前提下完成版本迭代。其核心逻辑…...
手持小风扇方案解说---【其利天下技术】
春去夏来,酷暑时节,小风扇成为外出必备的解暑工具,近年来,随着无刷电机的成本急剧下降,小风扇也逐步从有刷变无刷化了。 数量最大的如一箱无刷马达,其次三相低压无刷电机也大量被一些中高端风扇大量采用。…...
Qt开发:枚举的介绍和使用
文章目录 一、概述二、Qt 中定义和使用枚举2.1 普通枚举的定义方式2.2 使用枚举 三、配合 Qt 元对象系统使用枚举3.1 使用 Q_ENUM(Qt 5.5 及以上)3.2 示例:枚举值转字符串3.4 示例:字符串转枚举值 四、枚举与字符串相互转换五、枚…...
HarmonyOS运动开发:如何集成百度地图SDK、运动跟随与运动公里数记录
前言 在开发运动类应用时,集成地图功能以及实时记录运动轨迹和公里数是核心需求之一。本文将详细介绍如何在 HarmonyOS 应用中集成百度地图 SDK,实现运动跟随以及运动公里数的记录。 一、集成百度地图 SDK 1.引入依赖 首先,需要在项目的文…...
“胖都来”商标申请可以通过注册不!
近日“胖都来”被网友认为是蹭“胖东来”品牌流量在互联网上引起争议,看到许多自媒体说浙江这家公司已拿到“胖都来”的注册商标,普推知产商标老杨经检索后发现是没有的,只是申请受理。 对于商城类主要类别是在35类广告销售,核心是…...
【Django】中间件
Django 中间件是 Django 框架里一个轻量级、可插拔的组件,它能在全局范围内对 Django 的请求和响应进行处理。中间件处于 Django 的请求处理流程之中,在请求抵达视图函数之前以及视图函数返回响应之后执行特定操作。以下是关于 Django 中间件的详细介绍&…...