国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

如何高效優(yōu)化Go中cipher.AEAD.Seal()的內(nèi)存使用

Go編程,cipher.AEAD.Seal(),內(nèi)存優(yōu)化,ChaCha20-Poly1305,Golang加密算法

GoLang cipher.AEAD.Seal()

在使用Go語(yǔ)言中的ChaCha20-Poly1305實(shí)現(xiàn)進(jìn)行數(shù)據(jù)加密時(shí),有時(shí)會(huì)發(fā)現(xiàn)內(nèi)存使用量比預(yù)期要高。這是因?yàn)镚o語(yǔ)言的AEAD(Authenticated Encryption with Associated Data)密碼實(shí)現(xiàn)的方式要求我們將整個(gè)數(shù)據(jù)保存在內(nèi)存中以創(chuàng)建哈希值,而不僅僅是明文大小。

示例

下面是一個(gè)簡(jiǎn)單的例子程序,加密4 GiB的數(shù)據(jù):

package main
import (
"fmt"
"os"
"runtime"
"golang.org/x/crypto/chacha20poly1305"
)
func main() {
showMemUsage("START")
plaintext := make([]byte, 4*1024*1024*1024) // 4 GiB
showMemUsage("STAGE 1")
key := make([]byte, chacha20poly1305.KeySize)
if cipher, err := chacha20poly1305.New(key); err == nil {
showMemUsage("STAGE 2")
nonce := make([]byte, chacha20poly1305.NonceSize)
cipher.Seal(plaintext[:0], nonce, plaintext, nil)
}
showMemUsage("END")
}
func showMemUsage(tag string) {
var m runtime.MemStats
runtime.ReadMemStats(&m)
fmt.Fprintf(os.Stdout, "[%s] Alloc = %v MiB, TotalAlloc = %v MiB\n", tag, m.Alloc/1024/1024, m.TotalAlloc/1024/1024)
}

根據(jù)源代碼注釋,我們可以使用`plaintext[:0]`作為目標(biāo)切片來(lái)重用明文的存儲(chǔ)空間。然而,在這個(gè)例子中,無(wú)論我們?nèi)绾螄L試重用內(nèi)存,程序總是使用了8 GiB的內(nèi)存來(lái)加密4 GiB的數(shù)據(jù)。

[START] Alloc = 0 MiB, TotalAlloc = 0 MiB
[STAGE 1] Alloc = 4096 MiB, TotalAlloc = 4096 MiB
[STAGE 2] Alloc = 4096 MiB, TotalAlloc = 4096 MiB
[END] Alloc = 8192 MiB, TotalAlloc = 8192 MiB

為什么會(huì)出現(xiàn)這種情況?

ChaCha20-Poly1305密碼的工作原理

ChaCha20-Poly1305是一個(gè)AEAD密碼,它將明文與隨機(jī)生成的nonce結(jié)合起來(lái),并使用密鑰進(jìn)行加密。同時(shí),它還會(huì)生成一個(gè)16字節(jié)的認(rèn)證標(biāo)簽(authentication tag),附加到密文的末尾。在解密時(shí),我們需要驗(yàn)證認(rèn)證標(biāo)簽以確保密文的完整性和真實(shí)性。

解析代碼

根據(jù)源代碼注釋和問(wèn)題中提到的話題,我們可以看出問(wèn)題可能出在切片的容量上。根據(jù)Go語(yǔ)言的規(guī)范,切片的長(zhǎng)度可以小于或等于其容量,但不能超過(guò)容量。

  1. 首先創(chuàng)建了一個(gè)大小為4 GiB的明文切片`plaintext`。然后,我們生成了一個(gè)密鑰`key`并使用它初始化了一個(gè)ChaCha20-Poly1305密碼實(shí)例`cipher`。

  2. 我們生成了一個(gè)隨機(jī)的nonce,并調(diào)用`cipher.Seal()`方法來(lái)對(duì)明文進(jìn)行加密。

  3. 問(wèn)題中提到的疑惑在于,即使我們嘗試重用在cipher.AEAD.Seal()方法中,參數(shù)dst被用于存儲(chǔ)加密后的數(shù)據(jù),而參數(shù)plaintext作為輸入明文數(shù)據(jù)。根據(jù)源代碼注釋,如果我們希望重用明文的存儲(chǔ)空間用于加密輸出,我們應(yīng)該使用`plaintext[:0]`作為dst參數(shù)。這樣做將確保加密后的數(shù)據(jù)直接寫入到原始明文切片中,并避免額外的內(nèi)存分配。

  4. 在我們的示例程序中,無(wú)論我們?nèi)绾螄L試重用`plaintext[:0]`作為dst參數(shù),程序都會(huì)占用8 GiB的內(nèi)存來(lái)加密4 GiB的數(shù)據(jù)。這是因?yàn)镚o語(yǔ)言的cipher.AEAD.Seal()方法在進(jìn)行加密操作時(shí),會(huì)為密文數(shù)據(jù)分配一個(gè)新的切片并返回。雖然我們使用了`plaintext[:0]`作為dst參數(shù),但實(shí)際上它不會(huì)改變分配的內(nèi)存量。

那么有沒(méi)有辦法減少內(nèi)存占用呢? 

答案是:有的。我們可以通過(guò)手動(dòng)創(chuàng)建一個(gè)長(zhǎng)度已知且足夠容納密文的切片,然后將其傳遞給cipher.AEAD.Seal()方法。這樣做可以避免cipher.AEAD.Seal()方法中的額外內(nèi)存分配。

下面是修改后的示例代碼:

package main
import (
"fmt"
"os"
"runtime"
"golang.org/x/crypto/chacha20poly1305"
)
func main() {
showMemUsage("START")
plaintext := make([]byte, 4*1024*1024*1024) // 4 GiB
showMemUsage("STAGE 1")
key := make([]byte, chacha20poly1305.KeySize)
if cipher, err := chacha20poly1305.New(key); err == nil {
showMemUsage("STAGE 2")
nonce := make([]byte, chacha20poly1305.NonceSize)
ciphertext := make([]byte, len(plaintext)+cipher.Overhead())
cipher.Seal(ciphertext[:0], nonce, plaintext, nil)
}
showMemUsage("END")
}
func showMemUsage(tag string) {
var m runtime.MemStats
runtime.ReadMemStats(&m)
fmt.Fprintf(os.Stdout, "[%s] Alloc = %v MiB, TotalAlloc = %v MiB\n", tag, m.Alloc/1024/1024, m.TotalAlloc/1024/1024)
}

在修改后的代碼中,我們首先創(chuàng)建了一個(gè)足夠容納密文的切片`ciphertext`,并且長(zhǎng)度已知為明文切片`plaintext`的長(zhǎng)度加上密碼算法的Overhead(即認(rèn)證標(biāo)簽的大?。H缓?,我們將`ciphertext[:0]`作為dst參數(shù)傳遞給cipher.AEAD.Seal()方法,以確保加密后的數(shù)據(jù)直接寫入到原始切片中。

通過(guò)這種方式,我們可以減少內(nèi)存占用并提高性能。運(yùn)行修改后的示例程序,你會(huì)發(fā)現(xiàn)內(nèi)存使用量與明文大小相匹配:

[START] Alloc = 0 MiB, TotalAlloc = 0 MiB
[STAGE 1] Alloc = 4096 MiB, TotalAlloc = 4096 MiB
[STAGE 2] Alloc = 4096 MiB, TotalAlloc = 8192 MiB
[END] Alloc = 8192 MiB, TotalAlloc = 8192 MiB

現(xiàn)在,程序只使用了與明文大小相匹配的內(nèi)存(4 GiB),而不再占用8 GiB的內(nèi)存。這是因?yàn)槲覀兪謩?dòng)創(chuàng)建了一個(gè)足夠容納密文的切片,并將其傳遞給cipher.AEAD.Seal()方法,避免了額外的內(nèi)存分配。

通過(guò)優(yōu)化cipher.AEAD.Seal()方法的內(nèi)存使用,我們可以提高加密性能并減少內(nèi)存消耗,從而更好地滿足應(yīng)用程序的需求。文章來(lái)源地址http://www.zghlxwxcb.cn/article/662.html

到此這篇關(guān)于如何高效優(yōu)化Go中cipher.AEAD.Seal()的內(nèi)存使用的文章就介紹到這了,更多相關(guān)內(nèi)容可以在右上角搜索或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

原文地址:http://www.zghlxwxcb.cn/article/662.html

如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)聯(lián)系站長(zhǎng)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 掌握 Spring Boot 運(yùn)行內(nèi)存及內(nèi)存參數(shù)設(shè)置:助力高效應(yīng)用部署與優(yōu)化

    pring Boot 是當(dāng)今非常流行的 Java 應(yīng)用框架之一,在企業(yè)級(jí)應(yīng)用開(kāi)發(fā)中被廣泛使用。應(yīng)用部署和優(yōu)化是企業(yè)級(jí)應(yīng)用開(kāi)發(fā)的一個(gè)非常重要的方面。在這篇博客中,我們將學(xué)習(xí)如何掌握 Spring Boot 運(yùn)行內(nèi)存及內(nèi)存參數(shù)設(shè)置,從而助力高效的應(yīng)用部署和優(yōu)化。 Java 應(yīng)用程序通過(guò) Java 虛擬

    2024年01月21日
    瀏覽(32)
  • pandas DataFrame內(nèi)存優(yōu)化技巧:讓數(shù)據(jù)處理更高效

    pandas DataFrame內(nèi)存優(yōu)化技巧:讓數(shù)據(jù)處理更高效

    Pandas 無(wú)疑是我們數(shù)據(jù)分析時(shí)一個(gè)不可或缺的工具,它以其強(qiáng)大的數(shù)據(jù)處理能力、靈活的數(shù)據(jù)結(jié)構(gòu)以及易于上手的API贏得了廣大數(shù)據(jù)分析師和機(jī)器學(xué)習(xí)工程師的喜愛(ài)。 然而,隨著數(shù)據(jù)量的不斷增長(zhǎng),如何高效、合理地管理內(nèi)存,確保 Pandas DataFrame 在運(yùn)行時(shí)不會(huì)因內(nèi)存不足而崩

    2024年03月14日
    瀏覽(39)
  • 使用秘籍|如何實(shí)現(xiàn)圖數(shù)據(jù)庫(kù) NebulaGraph 的高效建模、快速導(dǎo)入、性能優(yōu)化

    使用秘籍|如何實(shí)現(xiàn)圖數(shù)據(jù)庫(kù) NebulaGraph 的高效建模、快速導(dǎo)入、性能優(yōu)化

    本文整理自 NebulaGraph PD 方揚(yáng)在「NebulaGraph x KubeBlocks」meetup 上的演講,主要包括以下內(nèi)容: NebulaGraph 3.x 發(fā)展歷程 NebulaGraph 最佳實(shí)踐 建模篇 導(dǎo)入篇 查詢篇 NebulaGraph 自 2019 年 5 月開(kāi)源發(fā)布第一個(gè) alpha 版本以來(lái),陸陸續(xù)續(xù)發(fā)布了 2.0 GA,到現(xiàn)在 v3.6.0,已經(jīng)是 v3.x 版本中比較后期

    2024年02月10日
    瀏覽(34)
  • 【C語(yǔ)言進(jìn)階】智能管理:如何使用柔性數(shù)組實(shí)現(xiàn)內(nèi)存優(yōu)化

    目錄 一、定義 二、用法 三、特點(diǎn) 四、注意事項(xiàng) 五、總結(jié) 在 C 語(yǔ)言中,柔性數(shù)組(Flexible Array)是一種特殊類型的數(shù)組,它允許程序員在運(yùn)行時(shí)動(dòng)態(tài)地分配數(shù)組的大小,從而實(shí)現(xiàn)更靈活的內(nèi)存管理。本文將詳細(xì)介紹柔性數(shù)組的定義、用法、特點(diǎn)及注意事項(xiàng)。 C 語(yǔ)言的數(shù)組是

    2023年04月24日
    瀏覽(56)
  • DS/ML:模型全流程優(yōu)化之系統(tǒng)優(yōu)化—替代Pandas庫(kù)的大數(shù)據(jù)高效處理技術(shù)優(yōu)化集合如HDF5技術(shù)(壓縮文件)+vaex庫(kù)(內(nèi)存映射)+dask庫(kù)(集群技術(shù))替代pandas的各自騷操作實(shí)現(xiàn)代碼

    DS/ML:模型全流程優(yōu)化之系統(tǒng)優(yōu)化—替代Pandas庫(kù)的大數(shù)據(jù)高效處理技術(shù)優(yōu)化集合如HDF5技術(shù)(壓縮文件)+vaex庫(kù)(內(nèi)存映射)+dask庫(kù)(集群技術(shù))替代pandas的各自騷操作實(shí)現(xiàn)代碼 目錄

    2024年02月09日
    瀏覽(30)
  • redis如何優(yōu)化內(nèi)存

    string轉(zhuǎn)hash存 對(duì)key拆分,成hash,注意:每個(gè)hash key下的filed-value個(gè)數(shù)不能超過(guò)限定值,否則不會(huì)走ziplist存儲(chǔ);因此可以進(jìn)行hash算法來(lái)分配hash桶,控制每個(gè)桶的原數(shù)個(gè)數(shù);或者取數(shù)字key 的后三位,控制每個(gè)hash只有999個(gè)元素。 key 由string轉(zhuǎn)數(shù)字 問(wèn)題: 較小的概率發(fā)生hash沖突,

    2024年02月10日
    瀏覽(31)
  • go基礎(chǔ)07-了解map實(shí)現(xiàn)原理并高效使用

    對(duì)于C程序員出身的Gopher來(lái)說(shuō),map類型是和切片、interface一樣能讓他們感受到Go語(yǔ)言先進(jìn)性的重要語(yǔ)法元素。map類型也是Go語(yǔ)言中最常用的數(shù)據(jù)類型之一。 一些有關(guān)Go語(yǔ)言的中文教程或譯本將map稱為字典或哈希表,但在這里我選擇不譯,直接使用map。map是Go語(yǔ)言提供的一種抽象數(shù)

    2024年02月09日
    瀏覽(39)
  • 小白學(xué)go基礎(chǔ)06-了解切片實(shí)現(xiàn)原理并高效使用

    小白學(xué)go基礎(chǔ)06-了解切片實(shí)現(xiàn)原理并高效使用

    slice,中文多譯為切片,是Go語(yǔ)言在數(shù)組之上提供的一個(gè)重要的抽象數(shù)據(jù)類型。在Go語(yǔ)言中,對(duì)于絕大多數(shù)需要使用數(shù)組的場(chǎng)合,切片實(shí)現(xiàn)了完美替代。并且和數(shù)組相比,切片提供了更靈活、更高效的數(shù)據(jù)序列訪問(wèn)接口。 在對(duì)切片一探究竟之前,我們先來(lái)簡(jiǎn)單了解一下Go語(yǔ)言中

    2024年02月09日
    瀏覽(31)
  • MySQL中如何高效的實(shí)現(xiàn)模糊查詢(附30條優(yōu)化建議)

    在使用msyql進(jìn)行模糊查詢的時(shí)候,很自然的會(huì)用到like語(yǔ)句,通常情況下,在數(shù)據(jù)量小的時(shí)候,不容易看出查詢的效率,但在數(shù)據(jù)量達(dá)到百萬(wàn)級(jí),千萬(wàn)級(jí)的時(shí)候,查詢的效率就很容易顯現(xiàn)出來(lái)。這個(gè)時(shí)候查詢的效率就顯得很重要! 一般情況下like模糊查詢的寫法為(field已建立索

    2024年01月22日
    瀏覽(32)
  • 內(nèi)存不夠大?python如何對(duì)內(nèi)存進(jìn)行優(yōu)化

    對(duì)于C語(yǔ)言來(lái)說(shuō),內(nèi)存泄露是個(gè)很常見(jiàn)的事故,因此寫代碼的時(shí)候要格外注意 無(wú)用內(nèi)存的釋放 ,但是對(duì)于pythoner來(lái)說(shuō),一般都不會(huì)關(guān)心這些,因?yàn)閜ython會(huì)自己去管理內(nèi)存。 但是最近我遇到一個(gè)問(wèn)題,我在寫一個(gè)程序,將會(huì)占用很大的內(nèi)存,我先使用了一個(gè)集合用來(lái)存儲(chǔ)數(shù)據(jù)。

    2024年02月05日
    瀏覽(30)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包