【加解密與C】HASH系列(二) SHA

SHA(安全散列算法)簡介

SHA(Secure Hash Algorithm)是由美國國家安全局(NSA)設計的一系列密碼散列函數,用于將任意長度的數據轉換為固定長度的散列值。SHA家族包括SHA-1、SHA-2(含SHA-256、SHA-384、SHA-512等)和SHA-3,廣泛應用于數據完整性驗證、數字簽名和密碼學安全領域。

SHA算法的主要特性

  1. 確定性:相同的輸入始終生成相同的散列值。
  2. 不可逆性:無法從散列值反推原始數據。
  3. 雪崩效應:輸入的微小變化會導致輸出散列值顯著不同。
  4. 抗碰撞性:難以找到兩個不同輸入產生相同的散列值。

常見SHA算法及其區別

SHA-1
  • 輸出長度:160位(20字節)。
  • 安全性:已不推薦用于安全場景,因存在理論碰撞攻擊風險。
SHA-2
  • 包含多個變體:
    • SHA-256:輸出256位(32字節),最常用。
    • SHA-384:輸出384位(48字節)。
    • SHA-512:輸出512位(64字節)。
  • 安全性:目前廣泛使用,未發現有效攻擊。
SHA-3
  • 基于Keccak算法,與SHA-2結構不同。
  • 輸出長度可選(224、256、384、512位)。
  • 設計上更抗未來潛在攻擊。

SHA的應用場景

  1. 數據完整性校驗:驗證文件或傳輸數據是否被篡改(如軟件下載校驗)。
  2. 密碼存儲:結合鹽值(salt)存儲用戶密碼散列值。
  3. 區塊鏈:比特幣等加密貨幣使用SHA-256計算區塊哈希。
  4. 數字簽名:生成消息摘要以進行簽名驗證。

本篇代碼不包含sha-3

sha.h

#ifndef __SHA__
#define __SHA__#include <stdint.h>void sha128(const uint8_t* data, size_t len, uint8_t digest[16]);void sha224(const uint8_t* data, size_t len, uint8_t digest[28]);void sha256_full(const uint8_t* data, size_t len, uint8_t digest[32]);void sha384(const uint8_t* data, size_t len, uint8_t digest[48]);void sha512_full(const uint8_t* data, size_t len, uint8_t digest[64]);void sha192(const uint8_t* data, size_t len, uint8_t digest[24]);#endif

sha.cpp

#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "sha.h"// ======================== 通用工具函數 ========================
#define ROTL(x, n) (((x) << (n)) | ((x) >> (32 - (n))))  // 32位循環左移
#define ROTR(x, n) (((x) >> (n)) | ((x) << (32 - (n))))
#define ROTL64(x, n) (((x) << (n)) | ((x) >> (64 - (n)))) // 循環左移
#define ROTR64(x, n) (((x) >> (n)) | ((x) << (64 - (n)))) // 循環右移// 內存反轉(大端序處理)
void mem_reverse(uint8_t *buf, size_t len) {for (size_t i = 0; i < len / 2; i++) {uint8_t tmp = buf[i];buf[i] = buf[len - 1 - i];buf[len - 1 - i] = tmp;}
}// ======================== SHA-1 (160位) ========================
void sha1(const uint8_t *data, size_t len, uint8_t digest[20]) {// 初始化哈希值uint32_t h[5] = {0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0};uint64_t bit_len = len * 8;size_t new_len = ((len + 8) / 64 + 1) * 64;uint8_t *msg = (uint8_t*)calloc(new_len, 1);memcpy(msg, data, len);msg[len] = 0x80; // 添加填充位// 添加長度信息(大端序)memcpy(msg + new_len - 8, &bit_len, 8);mem_reverse(msg + new_len - 8, 8);// 處理每個512位塊for (size_t i = 0; i < new_len; i += 64) {uint32_t w[80] = {0};for (int t = 0; t < 16; t++) memcpy(&w[t], msg + i + t * 4, 4);// 擴展消息for (int t = 16; t < 80; t++) w[t] = ROTL(w[t-3] ^ w[t-8] ^ w[t-14] ^ w[t-16], 1);uint32_t a = h[0], b = h[1], c = h[2], d = h[3], e = h[4];// 主循環for (int t = 0; t < 80; t++) {uint32_t f, k;if (t < 20) {f = (b & c) | ((~b) & d);k = 0x5A827999;} else if (t < 40) {f = b ^ c ^ d;k = 0x6ED9EBA1;} else if (t < 60) {f = (b & c) | (b & d) | (c & d);k = 0x8F1BBCDC;} else {f = b ^ c ^ d;k = 0xCA62C1D6;}uint32_t temp = ROTL(a, 5) + f + e + k + w[t];e = d; d = c; c = ROTL(b, 30); b = a; a = temp;}h[0] += a; h[1] += b; h[2] += c; h[3] += d; h[4] += e;}free(msg);// 輸出到digest(大端序)for (int i = 0; i < 5; i++) {mem_reverse((uint8_t*)&h[i], 4);memcpy(digest + i * 4, &h[i], 4);}
}// ======================== SHA-256/224 ========================
void sha256(const uint8_t *data, size_t len, uint8_t digest[32], int is224) {// 初始化哈希值uint32_t h[8] = {0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A,0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19};if (is224) {h[0] = 0xC1059ED8; h[1] = 0x367CD507; h[2] = 0x3070DD17; h[3] = 0xF70E5939;h[4] = 0xFFC00B31; h[5] = 0x68581511; h[6] = 0x64F98FA7; h[7] = 0xBEFA4FA4;}// 常量表const uint32_t k[64] = {0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC, 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2};// 預處理(填充)uint64_t bit_len = len * 8;size_t new_len = ((len + 8) / 64 + 1) * 64;uint8_t *msg = (uint8_t *)calloc(new_len, 1);memcpy(msg, data, len);msg[len] = 0x80;memcpy(msg + new_len - 8, &bit_len, 8);mem_reverse(msg + new_len - 8, 8);// 處理每個512位塊for (size_t i = 0; i < new_len; i += 64) {uint32_t w[64] = {0};for (int t = 0; t < 16; t++) {memcpy(&w[t], msg + i + t * 4, 4);mem_reverse((uint8_t*)&w[t], 4); // 轉大端序}// 擴展消息for (int t = 16; t < 64; t++) {uint32_t s0 = ROTR(w[t-15], 7) ^ ROTR(w[t-15], 18) ^ (w[t-15] >> 3);uint32_t s1 = ROTR(w[t-2], 17) ^ ROTR(w[t-2], 19) ^ (w[t-2] >> 10);w[t] = w[t-16] + s0 + w[t-7] + s1;}uint32_t a = h[0], b = h[1], c = h[2], d = h[3];uint32_t e = h[4], f = h[5], g = h[6], h_val = h[7];// 主循環for (int t = 0; t < 64; t++) {uint32_t S1 = ROTR(e, 6) ^ ROTR(e, 11) ^ ROTR(e, 25);uint32_t ch = (e & f) ^ ((~e) & g);uint32_t temp1 = h_val + S1 + ch + k[t] + w[t];uint32_t S0 = ROTR(a, 2) ^ ROTR(a, 13) ^ ROTR(a, 22);uint32_t maj = (a & b) ^ (a & c) ^ (b & c);uint32_t temp2 = S0 + maj;h_val = g; g = f; f = e; e = d + temp1;d = c; c = b; b = a; a = temp1 + temp2;}h[0] += a; h[1] += b; h[2] += c; h[3] += d;h[4] += e; h[5] += f; h[6] += g; h[7] += h_val;}free(msg);// 輸出結果for (int i = 0; i < (is224 ? 7 : 8); i++) {mem_reverse((uint8_t*)&h[i], 4);memcpy(digest + i * 4, &h[i], 4);}
}// ======================== SHA-512/384 ========================
void sha512(const uint8_t *data, size_t len, uint8_t digest[64], int is384) {// 初始化哈希值uint64_t h[8] = {0x6A09E667F3BCC908, 0xBB67AE8584CAA73B, 0x3C6EF372FE94F82B, 0xA54FF53A5F1D36F1,0x510E527FADE682D1, 0x9B05688C2B3E6C1F, 0x1F83D9ABFB41BD6B, 0x5BE0CD19137E2179};if (is384) {h[0] = 0xCBBB9D5DC1059ED8; h[1] = 0x629A292A367CD507; h[2] = 0x9159015A3070DD17;h[3] = 0x152FECD8F70E5939; h[4] = 0x67332667FFC00B31; h[5] = 0x8EB44A8768581511;h[6] = 0xDB0C2E0D64F98FA7; h[7] = 0x47B5481DBEFA4FA4;}// 常量表const uint64_t k[80] = {0x428A2F98D728AE22, 0x7137449123EF65CD, 0xB5C0FBCFEC4D3B2F, 0xE9B5DBA58189DBBC,0x3956C25BF348B538, 0x59F111F1B605D019, 0x923F82A4AF194F9B, 0xAB1C5ED5DA6D8118,0xD807AA98A3030242, 0x12835B0145706FBE, 0x243185BE4EE4B28C, 0x550C7DC3D5FFB4E2,0x72BE5D74F27B896F, 0x80DEB1FE3B1696B1, 0x9BDC06A725C71235, 0xC19BF174CF692694,0xE49B69C19EF14AD2, 0xEFBE4786384F25E3, 0x0FC19DC68B8CD5B5, 0x240CA1CC77AC9C65,0x2DE92C6F592B0275, 0x4A7484AA6EA6E483, 0x5CB0A9DCBD41FBD4, 0x76F988DA831153B5,0x983E5152EE66DFAB, 0xA831C66D2DB43210, 0xB00327C898FB213F, 0xBF597FC7BEEF0EE4,0xC6E00BF33DA88FC2, 0xD5A79147930AA725, 0x06CA6351E003826F, 0x142929670A0E6E70,0x27B70A8546D22FFC, 0x2E1B21385C26C926, 0x4D2C6DFC5AC42AED, 0x53380D139D95B3DF,0x650A73548BAF63DE, 0x766A0ABB3C77B2A8, 0x81C2C92E47EDAEE6, 0x92722C851482353B,0xA2BFE8A14CF10364, 0xA81A664BBC423001, 0xC24B8B70D0F89791, 0xC76C51A30654BE30,0xD192E819D6EF5218, 0xD69906245565A910, 0xF40E35855771202A, 0x106AA07032BBD1B8,0x19A4C116B8D2D0C8, 0x1E376C085141AB53, 0x2748774CDF8EEB99, 0x34B0BCB5E19B48A8,0x391C0CB3C5C95A63, 0x4ED8AA4AE3418ACB, 0x5B9CCA4F7763E373, 0x682E6FF3D6B2B8A3,0x748F82EE5DEFB2FC, 0x78A5636F43172F60, 0x84C87814A1F0AB72, 0x8CC702081A6439EC,0x90BEFFFA23631E28, 0xA4506CEBDE82BDE9, 0xBEF9A3F7B2C67915, 0xC67178F2E372532B,0xCA273ECEEA26619C, 0xD186B8C721C0C207, 0xEADA7DD6CDE0EB1E, 0xF57D4F7FEE6ED178,0x06F067AA72176FBA, 0x0A637DC5A2C898A6, 0x113F9804BEF90DAE, 0x1B710B35131C471B,0x28DB77F523047D84, 0x32CAAB7B40C72493, 0x3C9EBE0A15C9BEBC, 0x431D67C49C100D4C,0x4CC5D4BECB3E42B6, 0x597F299CFC657E2A, 0x5FCB6FAB3AD6FAEC, 0x6C44198C4A475817};// 預處理(填充)uint64_t bit_len = len * 8;size_t new_len = ((len + 16) / 128 + 1) * 128;uint8_t *msg = (uint8_t*)calloc(new_len, 1);memcpy(msg, data, len);msg[len] = 0x80;memcpy(msg + new_len - 16, &bit_len, 8); // 長度存儲在后128位的最后16字節中mem_reverse(msg + new_len - 16, 8);// 處理每個1024位塊for (size_t i = 0; i < new_len; i += 128) {uint64_t w[80] = {0};for (int t = 0; t < 16; t++) {memcpy(&w[t], msg + i + t * 8, 8);mem_reverse((uint8_t*)&w[t], 8); // 轉大端序}// 擴展消息for (int t = 16; t < 80; t++) {uint64_t s0 = ROTR64(w[t-15], 1) ^ ROTR64(w[t-15], 8) ^ (w[t-15] >> 7);uint64_t s1 = ROTR64(w[t-2], 19) ^ ROTR64(w[t-2], 61) ^ (w[t-2] >> 6);w[t] = w[t-16] + s0 + w[t-7] + s1;}uint64_t a = h[0], b = h[1], c = h[2], d = h[3];uint64_t e = h[4], f = h[5], g = h[6], h_val = h[7];// 主循環for (int t = 0; t < 80; t++) {uint64_t S1 = ROTR64(e, 14) ^ ROTR64(e, 18) ^ ROTR64(e, 41);uint64_t ch = (e & f) ^ ((~e) & g);uint64_t temp1 = h_val + S1 + ch + k[t] + w[t];uint64_t S0 = ROTR64(a, 28) ^ ROTR64(a, 34) ^ ROTR64(a, 39);uint64_t maj = (a & b) ^ (a & c) ^ (b & c);uint64_t temp2 = S0 + maj;h_val = g; g = f; f = e; e = d + temp1;d = c; c = b; b = a; a = temp1 + temp2;}h[0] += a; h[1] += b; h[2] += c; h[3] += d;h[4] += e; h[5] += f; h[6] += g; h[7] += h_val;}free(msg);// 輸出結果for (int i = 0; i < (is384 ? 6 : 8); i++) {mem_reverse((uint8_t*)&h[i], 8);memcpy(digest + i * 8, &h[i], 8);}
}// ======================== 用戶接口函數 ========================
void sha128(const uint8_t *data, size_t len, uint8_t digest[16]) {uint8_t full_digest[20];sha1(data, len, full_digest);memcpy(digest, full_digest, 16); // 截取前128位
}void sha224(const uint8_t *data, size_t len, uint8_t digest[28]) {sha256(data, len, digest, 1);
}void sha256_full(const uint8_t *data, size_t len, uint8_t digest[32]) {sha256(data, len, digest, 0);
}void sha384(const uint8_t *data, size_t len, uint8_t digest[48]) {sha512(data, len, digest, 1);
}void sha512_full(const uint8_t *data, size_t len, uint8_t digest[64]) {sha512(data, len, digest, 0);
}void sha192(const uint8_t *data, size_t len, uint8_t digest[24]) {uint8_t full_digest[64];sha512_full(data, len, full_digest);memcpy(digest, full_digest, 24); // 截取前192位
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/87378.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/87378.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/87378.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Python】進階 - 數據結構與算法

系列篇章&#x1f389; No.文章1【Python】基礎知識&#xff08;詳細&#xff09;&#x1f680;2【Python】基礎 - 循環、容器類型&#x1f680;3【Python】基礎 - 推導式、函數&#x1f680;4【Python】基礎 - 文件、異常、模塊&#x1f680;5【Python】進階 - 面向對象&…

【如何實現分布式壓測中間件】

分布式壓測中間件的原理及其實現 原理全鏈路追蹤框架&#xff08;Trace&#xff09;MQ中間件數據庫分布式緩存中間件&#xff08;Redis&#xff09;分庫分表中間件 原理 通過大量閱讀中間件源碼&#xff0c;開源社區調研&#xff0c;得到設計原理&#xff1a; &#xff08;1&a…

Qt進程間保活方案:詳解如何實現進程間通信與自動保活機制

目錄 摘要 一、進程間保活的基本原理 二、具體步驟及代碼示例 三、常見問題與優化 四、總體方案 摘要 在一些需要長時間運行的應用程序中&#xff0c;確保進程在意外退出時能夠自動重啟是一項非常重要的任務。尤其是在嵌入式開發、后臺服務以及需要高可用性的場景下&#x…

Python-內置數據結構-list-tuple-bubble-字符串-bytes-bytesarray-切片-學習筆記

欠4年前自己的一份筆記&#xff0c;獻給今后的自己。 分類 數值型 int、float、complex、bool 序列對象 字符串 str 列表 list tuple 鍵值對 集合set 字典dict 數值型 int、float、complex、bool都是class&#x…

利用事務鉤子函數解決業務異步發送問題

利用事務鉤子函數解決業務異步發送問題 一、問題背景二、實現方案1、生產者代碼2、消費者代碼 三、測試與驗證1、未開啟事務場景2、開啟事務場景 四、項目結構及源碼 一、問題背景 在某項業務中&#xff0c;需要在事務完成后&#xff0c;寫入日志到某數據庫中。需要要么都成功&…

uniapp選擇相冊

概述 一款針對Android平臺下的圖片選擇器&#xff0c;支持從相冊獲取圖片、視頻、音頻&拍照&#xff0c;支持裁剪(單圖or多圖裁剪)、壓縮、主題自定義配置等功能&#xff0c;支持動態獲取權限&適配Android 5.0系統的開源圖片選擇框架。 支持Uniapp和Uniapp X下的Vue2、…

MAC 多應用切換技巧,單應用切換技巧

在 Mac 上&#xff0c;有幾種快捷鍵可以幫助你快速切換應用程序窗口&#xff1a; 1. Command (?) Tab - 這是最常用的快捷鍵&#xff0c;用于在打開的應用程序之間進行循環切換。按住 Command 鍵不放&#xff0c;然后反復按下 Tab 鍵可以選擇下一個應用程序。當你松開 Comm…

SpringBoot+本地部署大模型實現知識庫功能

SpringBoot本地部署大模型實現RAG知識庫功能 1、Linux系統部署本地大模型1.1 安裝ollama1.2 啟動ollama1.3 下載deepseek模型 2、Springboot代碼調用本地模型實現基礎問答功能3、集成向量數據庫4、知識庫數據喂取5、最終實現RAG知識庫功能 1、Linux系統部署本地大模型 1.1 安裝…

嵌入式原理與應用篇---ARM

ARM 架構的 STM32 系列微控制器廣泛應用于嵌入式系統開發&#xff0c;理解其匯編語言指令對于優化性能、訪問硬件底層非常重要。下面詳細解釋常見的 ARM 匯編指令及其使用實例。 數據處理指令 1. MOV&#xff08;移動&#xff09; 功能&#xff1a;將立即數或寄存器值復制到…

【RHCSA-Linux考試題目筆記(自用)】servera的題目

一、開始 1、啟動rhcsa環境 2、點擊題目&#xff0c;看題 3、通過控制器來啟動所有虛擬機 控制器 打開后點start&#xff0c;然后ok 之后進入一個有classroom、servera、serverb&#xff08;考試不一定叫這些名&#xff0c;但大差不差&#xff09;什么之類的界面&#xff0c;…

SpringBoot項目使用arthas-tunnel-server

參考官網Arthas Spring Boot Starter | arthas Spring Boot系列之使用Arthas Tunnel Server 進行遠程調試實踐-騰訊云開發者社區-騰訊云 springBoot項目, 增加maven依賴 <dependency><groupId>com.taobao.arthas</groupId><artifactId>arthas-sprin…

Modbus TCP 進階:基于以太網的遠程設備控制(二)

基于 Modbus TCP 的遠程設備控制實戰 &#xff08;一&#xff09;硬件與網絡搭建實操 1. 設備選型與連接 在工業現場&#xff0c;根據遠程控制需求進行設備選型至關重要 。對于傳感器&#xff0c;若要監測溫度&#xff0c;可選擇高精度的熱電偶傳感器&#xff0c;如 K 型熱電…

分庫分表之實戰-sharding-JDBC

大家好&#xff0c;我是工藤學編程 &#x1f989;一個正在努力學習的小博主&#xff0c;期待你的關注實戰代碼系列最新文章&#x1f609;C實現圖書管理系統&#xff08;Qt C GUI界面版&#xff09;SpringBoot實戰系列&#x1f437;【SpringBoot實戰系列】Sharding-Jdbc實現分庫…

httpcore-nio引起的線程、fd泄露問題

依賴來源&#xff1a;httpasyncclient-4.1.4.jar 現象 程序報錯too many open files 線程數飆升、句柄數飆升 thread dump顯示大量 "I/O dispatcher 7215" #9102 prio5 os_prio0 tid0x00002b7ba036a800 nid0x6f24 runnable [0x00002b7d98d41000]java.lang.Thread.…

多線程生產者消費者模型實戰案例

多線程生產者消費者模型實戰案例 前言業務場景術前準備無鎖無事務有事務 synchronized事務在鎖外事務在鎖內 數據庫行鎖什么是數據庫行鎖有事務沒有事務 樂觀鎖ReentrantLock分布式鎖 前言 曾經一直有一個疑惑&#xff0c;就是關于多線程生產者消費者模型的學習過程中&#xf…

青少年編程與數學 02-022 專業應用軟件簡介 03 三維建模及動畫軟件:Autodesk Maya

青少年編程與數學 02-022 專業應用軟件簡介 03 三維建模及動畫軟件&#xff1a;Autodesk Maya 一、什么是三維建模二、什么是計算機動畫三、三維建模及動畫設計軟件的發展歷程&#xff08;一&#xff09;早期探索階段&#xff08;20世紀60年代 - 80年代&#xff09;&#xff08…

獲得 OCM 大師證書學習歷練

當我站在山城重慶的洪崖洞前&#xff0c;看著璀璨的夜景倒映在嘉陵江上&#xff0c;手中緊握著 OCM 大師證書&#xff0c;那一刻&#xff0c;備考時的艱辛與考試時的緊張都化作了滿滿的成就感。這段在重慶獲得 OCM 大師證書的經歷&#xff0c;就像一場充滿挑戰與驚喜的冒險&…

srs-gb28181 與 SRS 5.0 對 GB28181 國標支持

srs-gb28181 是基于 SRS 4.0/5.0 的國標&#xff08;GB28181&#xff09;擴展分支&#xff0c;而 SRS 5.0 官方版本也逐步增強了對 GB28181 的支持。以下是兩者的主要區別&#xff1a; 1. 功能支持對比 功能srs-gb28181&#xff08;擴展分支&#xff09;SRS 5.0&#xff08;官…

算法第18天|繼續二叉樹:修剪二叉搜索樹、將有序數組轉化為二叉搜索樹、把二叉搜索樹轉換為累加樹

今日總結&#xff1a; 1、修剪二叉搜索樹&#xff08;重點思考如何修剪&#xff09; &#xff08;1&#xff09;遞歸的返回值是什么&#xff1f;&#xff08;與插入、刪除一樣&#xff09; &#xff08;2&#xff09;遞歸的單層邏輯一定要縷清&#xff08;3中情況討論&#xff…

C# 多線程(三)線程池

目錄 1.通過TPL使用線程池 2.不使用TPL進入線程池的辦法 異步委托 3.線程池優化技術 最小線程數的工作原理 每當啟動一個新線程時&#xff0c;系統都需要花費數百微秒來分配資源&#xff0c;例如創建獨立的局部變量棧空間。默認情況下&#xff0c;每個線程還會占用約1…