哈希码:原理、用途与实现详解

博主在《在C语言中使用字典》一文中,使用哈希来实现键值对的快速检索,今天对哈希这一算法工具,进行一些深入的研究,争取能能做到知其然亦知其所以然。

文章目录

  • 哈希码:原理、用途与实现详解
    • 一、哈希码的原理
      • 1.1 什么是哈希码?
      • 1.2 哈希函数的特性
      • 1.3 哈希冲突
    • 二、哈希的表达式
      • 2.1 通用哈希函数表达式
      • 2.2 多项式哈希函数(Polynomial Hashing)
      • 2.3 DJB2 哈希函数
      • 2.4 SHA-256 哈希函数
        • (1) 初始化工作变量
        • (2) 主压缩循环
        • (3) 更新哈希值
      • 2.5 MD5 哈希函数
        • (1) 初始化缓冲区
        • (2) 主循环(四组 16 轮)
        • (3) 更新缓冲区
      • 2.6 哈希冲突解决方法的显性表达式
        • (1) 链地址法(拉链法)
        • (2) 开放定址法(线性探测)
        • (3) 双散列函数法
      • 5. 小结
    • 三、哈希码的用途
      • 3.1 数据检索
      • 3.2 数据完整性验证
      • 3.3 密码存储
      • 3.4 分布式系统
    • 四、哈希码的实现
      • 4.1 C语言实现哈希码计算
        • 代码解析:
        • 输出示例:
      • 4.2 哈希表实现
        • 代码解析:
    • 五、总结

哈希码(Hash Code)是计算机科学中的核心概念之一,广泛应用于数据存储、检索、安全等领域。本文将从原理数学表达式用途实现四个方面详细介绍哈希码,并提供一个完整的C语言实现示例。


一、哈希码的原理

1.1 什么是哈希码?

哈希码是通过哈希函数将任意长度的数据(如字符串、文件等)映射为固定长度数值的过程。其核心思想是通过数学变换,将复杂的数据结构转换为一个唯一的标识符。

1.2 哈希函数的特性

哈希函数具有以下关键特性:

  1. 单向性
    从原始数据计算哈希码是单向的,即无法通过哈希码反推出原始数据。
    Hash ( x ) = h 但 x ≠ Hash − 1 ( h ) \text{Hash}(x) = h \quad \text{但} \quad x \neq \text{Hash}^{-1}(h) Hash(x)=hx=Hash1(h)

  2. 确定性
    相同的输入数据始终生成相同的哈希码。
    x 1 = x 2 ⇒ Hash ( x 1 ) = Hash ( x 2 ) x_1 = x_2 \Rightarrow \text{Hash}(x_1) = \text{Hash}(x_2) x1=x2Hash(x1)=Hash(x2)

  3. 敏感性
    输入的微小变化会导致哈希码的显著改变。
    x 1 ∼ x 2 但 Hash ( x 1 ) ≠ Hash ( x 2 ) x_1 \sim x_2 \quad \text{但} \quad \text{Hash}(x_1) \neq \text{Hash}(x_2) x1x2Hash(x1)=Hash(x2)

  4. 均匀性
    哈希码在输出空间中均匀分布,减少冲突概率。
    ∀ x , y , Hash ( x ) ≈ UniformDistribution \forall x, y, \quad \text{Hash}(x) \approx \text{UniformDistribution} x,y,Hash(x)UniformDistribution

1.3 哈希冲突

哈希冲突是指不同的输入生成相同的哈希码。由于哈希函数的输出空间有限,而输入空间无限,冲突是不可避免的。常见的解决方法包括:

  • 链地址法:将冲突的键值对存储在链表中。
  • 开放寻址法:通过探查算法寻找空闲位置。

二、哈希的表达式

哈希函数的显性表达式因具体算法而异,以下是几种常见哈希函数的显性表达式及其数学形式:

2.1 通用哈希函数表达式

哈希函数的基本形式为:
Addr = H ( key ) \text{Addr} = H(\text{key}) Addr=H(key)
其中:

  • key \text{key} key:输入数据(字符串、数值等)。
  • H H H:哈希函数。
  • Addr \text{Addr} Addr:输出的哈希码(通常为固定长度的整数或二进制串)。

2.2 多项式哈希函数(Polynomial Hashing)

多项式哈希函数通过将输入字符串视为多项式系数,计算其模值:
H ( s ) = ( ∑ i = 0 n − 1 a i ⋅ x i ) m o d m H(s) = \left( \sum_{i=0}^{n-1} a_i \cdot x^i \right) \mod m H(s)=(i=0n1aixi)modm
其中:

  • s = a 0 a 1 … a n − 1 s = a_0a_1\ldots a_{n-1} s=a0a1an1:输入字符串,长度为 n n n
  • x x x:基数(常选质数,如 31、37)。
  • m m m:模数(通常为哈希表大小)。
  • m o d mod mod:取模(求余)运算。

示例
对于字符串 “abc”(ASCII 码分别为 97, 98, 99),若 x = 31 x=31 x=31, m = 1000 m=1000 m=1000
H ( " a b c " ) = ( 97 ⋅ 31 0 + 98 ⋅ 31 1 + 99 ⋅ 31 2 ) m o d 1000 H("abc") = (97 \cdot 31^0 + 98 \cdot 31^1 + 99 \cdot 31^2) \mod 1000 H("abc")=(97310+98311+99312)mod1000

2.3 DJB2 哈希函数

DJB2 是一种简单高效的哈希算法,其显性表达式为:
hash = ( ( hash ≪ 5 ) + hash ) + c \text{hash} = ((\text{hash} \ll 5) + \text{hash}) + c hash=((hash5)+hash)+c
其中:

  • ≪ \ll :左移运算(等价于乘以 2 5 = 32 2^5 = 32 25=32)。
  • c c c:当前字符的 ASCII 码。
  • 初始值 hash = 5381 \text{hash} = 5381 hash=5381

等价数学形式
hash new = ( hash old × 33 ) + c \text{hash}_{\text{new}} = (\text{hash}_{\text{old}} \times 33) + c hashnew=(hashold×33)+c
迭代公式:
hash = ∑ i = 0 n − 1 c i ⋅ 33 n − 1 − i \text{hash} = \sum_{i=0}^{n-1} c_i \cdot 33^{n-1-i} hash=i=0n1ci33n1i


2.4 SHA-256 哈希函数

SHA-256 是一种密码学哈希函数,其核心步骤包括多项式运算和位操作。以下是其关键步骤的显性表达式:

(1) 初始化工作变量

a = h 0 , b = h 1 , c = h 2 , d = h 3 , e = h 4 , f = h 5 , g = h 6 , h = h 7 \begin{align*} a &= h_0, \quad b = h_1, \quad c = h_2, \quad d = h_3, \\ e &= h_4, \quad f = h_5, \quad g = h_6, \quad h = h_7 \end{align*} ae=h0,b=h1,c=h2,d=h3,=h4,f=h5,g=h6,h=h7
其中 h 0 ∼ h 7 h_0 \sim h_7 h0h7 为固定初始值(十六进制):
h 0 = 0 x 6 a 09 e 667 , h 1 = 0 x b b 67 a e 85 , h 2 = 0 x 3 c 6 e f 372 , h 3 = 0 x a 54 f f 53 a , h 4 = 0 x 510 e 527 f , h 5 = 0 x 9 b 05688 c , h 6 = 0 x 1 f 83 d 9 a b , h 7 = 0 x 5 b e 0 c d 19 \begin{aligned} h_0 &= 0x6a09e667, \quad h_1 = 0xbb67ae85, \\ h_2 &= 0x3c6ef372, \quad h_3 = 0xa54ff53a, \\ h_4 &= 0x510e527f, \quad h_5 = 0x9b05688c, \\ h_6 &= 0x1f83d9ab, \quad h_7 = 0x5be0cd19 \end{aligned} h0h2h4h6=0x6a09e667,h1=0xbb67ae85,=0x3c6ef372,h3=0xa54ff53a,=0x510e527f,h5=0x9b05688c,=0x1f83d9ab,h7=0x5be0cd19

(2) 主压缩循环

对每个消息块执行 64 轮迭代,每轮更新工作变量:
T 1 = h + Σ 1 ( e ) + Ch ( e , f , g ) + K t + W t T 2 = Σ 0 ( a ) + Maj ( a , b , c ) \begin{aligned} T_1 &= h + \Sigma_1(e) + \text{Ch}(e,f,g) + K_t + W_t \\ T_2 &= \Sigma_0(a) + \text{Maj}(a,b,c) \end{aligned} T1T2=h+Σ1(e)+Ch(e,f,g)+Kt+Wt=Σ0(a)+Maj(a,b,c)
其中:

  • Σ 0 ( x ) = ROTR 2 ( x ) ⊕ ROTR 13 ( x ) ⊕ ROTR 22 ( x ) \Sigma_0(x) = \text{ROTR}^2(x) \oplus \text{ROTR}^{13}(x) \oplus \text{ROTR}^{22}(x) Σ0(x)=ROTR2(x)ROTR13(x)ROTR22(x)
  • Σ 1 ( x ) = ROTR 6 ( x ) ⊕ ROTR 11 ( x ) ⊕ ROTR 25 ( x ) \Sigma_1(x) = \text{ROTR}^6(x) \oplus \text{ROTR}^{11}(x) \oplus \text{ROTR}^{25}(x) Σ1(x)=ROTR6(x)ROTR11(x)ROTR25(x)
  • Ch ( x , y , z ) = ( x ∧ y ) ⊕ ( ¬ x ∧ z ) \text{Ch}(x,y,z) = (x \land y) \oplus (\lnot x \land z) Ch(x,y,z)=(xy)(¬xz)
  • Maj ( x , y , z ) = ( x ∧ y ) ⊕ ( x ∧ z ) ⊕ ( y ∧ z ) \text{Maj}(x,y,z) = (x \land y) \oplus (x \land z) \oplus (y \land z) Maj(x,y,z)=(xy)(xz)(yz)
  • K t K_t Kt:第 t t t 轮的常量。
  • W t W_t Wt:消息扩展后的第 t t t 个字。
(3) 更新哈希值

每轮迭代后更新工作变量:
h = g , g = f , f = e , e = d + T 1 d = c , c = b , b = a , a = T 1 + T 2 \begin{aligned} h &= g, \quad g = f, \quad f = e, \quad e = d + T_1 \\ d &= c, \quad c = b, \quad b = a, \quad a = T_1 + T_2 \end{aligned} hd=g,g=f,f=e,e=d+T1=c,c=b,b=a,a=T1+T2


2.5 MD5 哈希函数

MD5 将输入分块处理,每轮进行四组非线性变换。以下是其核心步骤的显性表达式:

(1) 初始化缓冲区

A = 0 x 67452301 , B = 0 x E F C D A B 89 , C = 0 x 98 B A D C F E , D = 0 x 10325476 A = 0x67452301, \quad B = 0xEFCDAB89, \quad C = 0x98BADCFE, \quad D = 0x10325476 A=0x67452301,B=0xEFCDAB89,C=0x98BADCFE,D=0x10325476

(2) 主循环(四组 16 轮)

每组使用不同的非线性函数 F , G , H , I F, G, H, I F,G,H,I

  • 第一组($ F(X,Y,Z) = (X \land Y) \lor (\lnot X \land Z) $):
    T = D + ⋘ s ( A + F ( B , C , D ) + X k + T i ) , 其中  s ∈ { 7 , 12 , 17 , 22 } T = D + \lll^s (A + F(B,C,D) + X_k + T_i), \quad \text{其中 } s \in \{7,12,17,22\} T=D+s(A+F(B,C,D)+Xk+Ti),其中 s{7,12,17,22}
  • 第二组($ G(X,Y,Z) = (X \land Z) \lor (Y \land \lnot Z) $):
    T = C + ⋘ s ( D + G ( A , B , C ) + X k + T i ) , s ∈ { 5 , 9 , 14 , 20 } T = C + \lll^s (D + G(A,B,C) + X_k + T_i), \quad s \in \{5,9,14,20\} T=C+s(D+G(A,B,C)+Xk+Ti),s{5,9,14,20}
  • 第三组($ H(X,Y,Z) = X \oplus Y \oplus Z $):
    T = B + ⋘ s ( C + H ( A , B , C ) + X k + T i ) , s ∈ { 4 , 11 , 16 , 23 } T = B + \lll^s (C + H(A,B,C) + X_k + T_i), \quad s \in \{4,11,16,23\} T=B+s(C+H(A,B,C)+Xk+Ti),s{4,11,16,23}
  • 第四组($ I(X,Y,Z) = Y \oplus (X \lor \lnot Z) $):
    T = A + ⋘ s ( B + I ( A , B , C ) + X k + T i ) , s ∈ { 6 , 10 , 15 , 21 } T = A + \lll^s (B + I(A,B,C) + X_k + T_i), \quad s \in \{6,10,15,21\} T=A+s(B+I(A,B,C)+Xk+Ti),s{6,10,15,21}
(3) 更新缓冲区

每组循环后更新 A , B , C , D A, B, C, D A,B,C,D
A = A + T , B = B + new value , C = C + new value , D = D + new value \begin{aligned} A &= A + T, \quad B = B + \text{new value}, \\ C &= C + \text{new value}, \quad D = D + \text{new value} \end{aligned} AC=A+T,B=B+new value,=C+new value,D=D+new value

2.6 哈希冲突解决方法的显性表达式

(1) 链地址法(拉链法)

对于哈希表 T T T,冲突键值对存储在链表中:
T [ index ] = LinkedList ( key 1 , key 2 , … ) T[\text{index}] = \text{LinkedList}(\text{key}_1, \text{key}_2, \ldots) T[index]=LinkedList(key1,key2,)
其中 index = H ( key ) m o d TABLE_SIZE \text{index} = H(\text{key}) \mod \text{TABLE\_SIZE} index=H(key)modTABLE_SIZE

(2) 开放定址法(线性探测)

冲突时按固定步长 p ( i ) = i p(i) = i p(i)=i 探查:
index i = ( H ( key ) + i ) m o d TABLE_SIZE \text{index}_i = (H(\text{key}) + i) \mod \text{TABLE\_SIZE} indexi=(H(key)+i)modTABLE_SIZE
直到找到空闲位置。

(3) 双散列函数法

冲突时使用第二个哈希函数 H ′ H' H
index i = ( H ( key ) + i ⋅ H ′ ( key ) ) m o d TABLE_SIZE \text{index}_i = (H(\text{key}) + i \cdot H'(\text{key})) \mod \text{TABLE\_SIZE} indexi=(H(key)+iH(key))modTABLE_SIZE

5. 小结

不同哈希函数的显性表达式反映了其设计思想和数学特性。例如:

  • 多项式哈希通过多项式展开实现均匀分布。
  • SHA-256/MD5依赖复杂的位运算和非线性函数保证安全性。
  • 冲突解决方法通过数学公式动态调整存储位置。

在实际应用中,选择哈希函数时需权衡 速度、均匀性、抗碰撞性 等因素。


三、哈希码的用途

3.1 数据检索

哈希码通过快速定位数据位置,显著提升检索效率。例如:

  • 哈希表:通过哈希函数将键映射到数组索引,实现 O ( 1 ) O(1) O(1) 时间复杂度的查找。
  • 数据库索引:B+树结合哈希加速数据查询。

3.2 数据完整性验证

哈希码可用于验证数据是否被篡改。例如:

  • 文件校验:通过比较文件的哈希码与已知值判断文件是否被修改。
  • 数字签名:对文档生成哈希码后加密,接收方解密后验证哈希码一致性。

3.3 密码存储

哈希码在密码学中用于安全存储密码。例如:

  • 密码哈希同步:将用户密码的哈希值从本地系统同步到云端。
  • 加盐哈希:在密码中添加随机值(盐),防止彩虹表攻击。

3.4 分布式系统

哈希码在分布式系统中用于数据分片和负载均衡。例如:

  • 一致性哈希:动态分配节点时减少数据迁移。
  • 布隆过滤器:通过多个哈希函数检测元素是否存在。

四、哈希码的实现

4.1 C语言实现哈希码计算

以下是一个基于 DJB2算法 的哈希码计算函数,该算法以低冲突率和高效性著称。

#include <stdio.h>
#include <string.h>// 哈希码计算函数(DJB2算法)
unsigned long hash_code(const char *str) {unsigned long hash = 5381;int c;while ((c = *str++)) {hash = ((hash << 5) + hash) + c; // hash * 33 + c}return hash;
}int main() {const char *test_str = "Hello, World!";unsigned long code = hash_code(test_str);printf("Input: %s\n", test_str);printf("Hash Code: %lu\n", code);return 0;
}
代码解析:
  1. DJB2算法

    • 初始值 hash = 5381 是经验值,用于优化分布。
    • 每次迭代中,hash = ((hash << 5) + hash) + c 等价于 hash * 33 + c,其中 33 是经过实测的最优系数。
    • 最终返回的哈希码为无符号长整型。
  2. 编译与运行
    保存为 hash_code.c,使用以下命令编译并运行:

    gcc -o hash_code hash_code.c
    ./hash_code
    
输出示例:
Input: Hello, World!
Hash Code: 11557940046392859113

4.2 哈希表实现

以下是基于哈希码的简单哈希表实现,支持插入和查找操作。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define TABLE_SIZE 100// 键值对结构体
typedef struct {char *key;int value;
} KeyValuePair;// 哈希表结构体
typedef struct {KeyValuePair *items[TABLE_SIZE];int size;
} HashTable;// 哈希码计算函数
unsigned long hash_code(const char *str) {unsigned long hash = 5381;int c;while ((c = *str++)) {hash = ((hash << 5) + hash) + c;}return hash;
}// 插入键值对
void insert(HashTable *table, const char *key, int value) {unsigned long index = hash_code(key) % TABLE_SIZE;KeyValuePair *pair = (KeyValuePair *)malloc(sizeof(KeyValuePair));pair->key = strdup(key);pair->value = value;table->items[index] = pair;table->size++;
}// 查找键值对
int find(HashTable *table, const char *key) {unsigned long index = hash_code(key) % TABLE_SIZE;if (table->items[index] && strcmp(table->items[index]->key, key) == 0) {return table->items[index]->value;}return -1; // 未找到
}// 释放哈希表
void free_table(HashTable *table) {for (int i = 0; i < TABLE_SIZE; i++) {if (table->items[i]) {free(table->items[i]->key);free(table->items[i]);}}free(table);
}int main() {HashTable table = {0};insert(&table, "apple", 10);insert(&table, "banana", 20);insert(&table, "orange", 30);printf("apple: %d\n", find(&table, "apple"));   // 输出: 10printf("banana: %d\n", find(&table, "banana")); // 输出: 20printf("grape: %d\n", find(&table, "grape"));   // 输出: -1free_table(&table);return 0;
}
代码解析:
  1. 哈希表结构

    • 使用数组 items 存储键值对指针。
    • TABLE_SIZE 定义哈希表大小。
  2. 插入与查找

    • 插入时通过哈希码取模定位数组索引。
    • 查找时直接通过哈希码定位索引,并比较键值。
  3. 冲突处理

    • 当多个键映射到同一索引时,当前实现会覆盖旧值。实际应用中可通过链地址法(链表)或开放寻址法解决冲突。

五、总结

哈希码是计算机科学中不可或缺的技术,其核心价值在于高效的数据映射与快速检索。通过合理设计哈希函数和冲突解决策略,可以显著提升系统的性能与安全性。本文通过理论讲解和代码实现,展示了哈希码的原理、用途及其实现方式。希望读者能通过本文深入理解哈希码的本质,并在实际开发中灵活应用。


研究学习不易,点赞易。
工作生活不易,收藏易,点收藏不迷茫 :)


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/910246.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/910246.shtml
英文地址,请注明出处:http://en.pswp.cn/news/910246.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

golang--channel的关键特性和行为

Go 语言 Channel 的核心特性与行为深度解析 Channel 是 Go 语言并发编程的核心组件&#xff0c;用于在不同 goroutine 之间进行通信和同步。以下是其关键特性和行为的全面分析&#xff1a; 一、基本特性 1. 类型安全通信管道 ch : make(chan int) // 只能传递整数2. 方向性…

HarmonyOS 5 鸿蒙多模态融合测试技术方案详解

以下是针对HarmonyOS 5多模态融合测试的技术方案详解&#xff0c;综合交互逻辑、容错机制及分布式验证等核心模块&#xff1a; ‌一、多模态交互核心逻辑验证‌ ‌事件融合机制‌ 通过kit.AbilityKit监听语音指令&#xff0c;结合ArkUI手势系统捕获屏幕坐标&#xff1a; import…

在AI普及的大环境下神经网络在新能源汽车热管理系统中的应用简介

一、神经网络的核心原理与结构 1. 生物启发与基础组成 神经网络&#xff08;Artificial Neural Network, ANN&#xff09;受生物神经元信息处理机制启发&#xff0c;由大量人工神经元互联构成计算模型。每个神经元接收输入信号&#xff08;如温度、流量等物理量&#xff09;&a…

​ CATIA V5与3DEXPERIENCE协同设计:引领无人机行业新纪元

在无人机行业蓬勃发展的今天&#xff0c;传统设计流程正面临前所未有的系统性挑战。更令人担忧的是&#xff0c;随着无人机应用场景的不断拓展&#xff0c;从农业植保到城市物流&#xff0c;从应急救援到军事侦察&#xff0c;对产品性能的要求日益严苛。传统设计方法已难以应对…

关于科技公司经营的一些想法

分析了一些我们公司的问题&#xff1a; 1&#xff0c;测试 重视测试&#xff0c;加大测试投入 2&#xff0c;人才 人才评判标准&#xff1a;结果论&#xff0c;主要根据该岗位问题的解决效率与质量评判。工作时长不重要 任人唯贤。尽可能录用能解决问题的人才&#xff0c;不…

校招生成长日记(一):初来乍到

提前来了几天&#xff0c;感受一下广东的生活。第一印象就是闷热&#xff01;后面尝了潮汕火锅&#xff0c;椰子鸡&#xff0c;荔枝&#xff0c;都很不错&#xff01;&#xff01;&#xff01;就是没有重口味的&#xff0c;好想念我的酸辣粉&#xff0c;麻辣烫啊......y走了瞬间…

【精选】移动端学习平台设计与开发 移动端平台开发(含资料阅读、时事新闻、时政答题与讨论功能) 基于移动端的专题教育平台设计与实现

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

Protobuf 高级特性详解 —— 嵌套消息、Oneof 字段与自定义选项

在前几篇文章中&#xff0c;我们已经掌握了 Protocol Buffers&#xff08;Protobuf&#xff09;的基础语法、.proto 文件的结构、以及如何使用 Go 和 Java 进行数据的序列化与反序列化操作。本篇文章将深入探讨 Protobuf 的高级特性&#xff0c;包括&#xff1a; 嵌套消息&…

golang--数据类型与存储

在 Go 语言中&#xff0c;理解值类型&#xff08;value types&#xff09;和引用类型&#xff08;reference types&#xff09;的区别对于编写高效、正确的代码至关重要。以下是主要的区别点和需要注意的特殊情况&#xff1a; 一、值类型&#xff08;Value Types&#xff09; …

uniapp——轮播图、产品列表轮播、上一页、下一页、一屏三张图

案例展示 组件封装 <template><view><view class="showSwiperBox"><view class="topSwiper"><swiper class="swiper" :autoplay="autoplay" interval="5000" :previous-margin="margin&qu…

用Python实现安全封装EXE文件加密保护工具

一、概述 这个Python脚本实现了一个强大的EXE文件加密保护工具,它能够将任何Windows可执行文件封装到一个带密码保护的GUI程序中。核心功能包括: 使用AES-256加密算法保护原始EXE文件 创建美观的密码验证界面 支持自定义程序图标 自动处理PyInstaller打包过程 修复Tkinter在…

vue3监听属性watch和watchEffect的详解

文章目录 1. 前言2. 常规用法3. 监听对象和route变化4. 使用场景4.1 即时表单验证4.2 搜索联想功能4.3 数据变化联动处理 5. watchEffect详解5-1 基本概念5-2 核心用法基础示例&#xff1a;自动响应依赖变化处理异步副作用停止监听与清理副作用 5-3 高级场景应用监听多个响应式…

Spring IoC核心实现揭秘

Spring IoC(控制反转)的实现机制是Spring框架的核心,其本质是将对象的创建、依赖管理和生命周期控制权从应用程序代码转移到容器中。以下是其核心实现机制: 🔧 一、核心实现步骤 配置元数据加载 容器启动时读取XML/注解/Java配置类,解析为BeanDefinition对象(包含类名、…

Solidity内部合约创建全解析:解锁Web3开发新姿势

合约创建基础 new 关键字创建合约 在 Solidity 中&#xff0c;new关键字是创建合约实例的最基本方式&#xff0c;它就像是一个 “魔法钥匙”&#xff0c;能够在以太坊区块链上生成一个全新的合约实例。使用new关键字创建合约的过程非常直观&#xff0c;就像我们在其他编程语言…

OCR大模型,破解金融文档处理困境,从文字识别到文字理解

金融机构在日常运营中处理海量文档。这些文档类型多样&#xff0c;格式复杂&#xff0c;是业务运营的基础。如何高效、准确地处理这些文档&#xff0c;直接影响机构的运营效率与风险控制水平。新一代的OCR大模型技术为此提供了有效的解决方案。它提升了文档处理的自动化程度与数…

2025.6.21笔记(2)

1.编写一个程序&#xff0c;输入一个整数&#xff0c;判断它是奇数还是偶数 解题思路&#xff1a; 1.因为要判断输入的数是奇数还是偶数&#xff0c;所以要用到if判断 2.判读奇偶数&#xff1a;如果这个数%20&#xff0c;则它为偶数&#xff0c;如果这个数%2!0&#xff0c;则…

【Ambari3.0.0 部署】Step7—Mariadb初始化-适用于el8

如果有其他系统部署需求可以参考原文 https://doc.janettr.com/install/manual/ MariaDB 10 是 Ambari 及大数据平台的常见数据库方案。本文适配 Rocky Linux 8.10&#xff0c;涵盖 MariaDB 10.11 推荐安装、YUM 源配置、参数优化、初始化和安全设置&#xff0c;帮助你一步到位…

SpringBoot电脑商城项目--删除收获地址+热销排行

删除收获地址 1 删除收获地址-持久层 1.1 规划sql语句 在删除操作之前判断该数据是否存在&#xff0c;判断该条地址的归属是否是当前的用户执行删除收货地址的操作 delete from t_address where aid? 如果用户删除的时默认地址&#xff0c;将剩下地址的某一条作为默认收货地…

MIMIC-III 数据集文件简介

文件简介&#xff1a; 共26个文件 admissions.csv 患者入院信息&#xff08;入院时间、出院时间、入院类型、科室等&#xff09;。 callout.csv ICU 外科室请求 ICU 会诊的呼叫记录。 caregivers.csv 护理患者的医护人员信息&#xff08;身份、角色等&#xff09;。…

UL/CE双认证!光宝MOC3052-A双向可控硅输出光耦 智能家居/工业控制必备!

光宝MOC3052-A双向可控硅输出光耦详解 1. 产品定位 MOC3052-A 是光宝科技&#xff08;Lite-On&#xff09;推出的 双向可控硅驱动光耦&#xff0c;属于光电隔离型半导体器件&#xff0c;主要用于交流负载的隔离控制&#xff0c;实现低压控制电路&#xff08;如MCU&#xff09;…