Hash
用於短輸入的快速加密雜湊函式
我正在尋找一種針對短輸入速度優化的加密雜湊函式,以實現擴展因子為 2 的偽隨機生成器(例如,輸入 16 個字節並輸出 32 個偽隨機字節)。
以下是我嘗試過的一些自然候選人:
- SHA256:良好的基線
- Blake2:專為大輸入的速度而設計,在短輸入時表現不佳
- AES-CTR:當硬體支持AES-NI時,比 SHA256 更快。輸入用作 AES 的密鑰,以加密具有所需輸出長度的預定義字節數組。但是,為每次呼叫散列函式重新初始化密碼是昂貴的。
我還發現了這個有趣的結構:STHash。它是一個鍵控加密散列函式,針對大輸入的速度進行了優化。我不介意使用鍵控散列函式而不是通用散列函式。
是否有任何類似的短輸入結構,或者比 AES-CTR 更有效地利用 AES-NI 的方法?
一些非正式的基準
對於每個散列函式,我將一個 16 字節的數組散列成一個 32 字節的數組,並重複 1000 萬次。對於像 AES 和 ChaCha 這樣的流密碼,我在每次迭代時創建一個新密碼,輸入作為公共固定明文和隨機數的密鑰。如果密碼需要 32 位密鑰,我只需用 0 填充輸入。如果散列函式沒有產生足夠的位(例如 SipHash 僅輸出 128 位),我會執行它幾次。
我在 Intel® Core™ i7-1065G7 CPU @ 1.30GHz × 8 上執行 Rust Nightly,實驗在單執行緒上執行。
- SipHash 1-3:476.9ms
- 恰恰8:590.4ms
- SIPHash:670.3ms
- AES-128:665.3 毫秒
- SHA256:780.4 毫秒
- Blake2s:1413.9ms
有關資訊,有關 Haraka 的一些結果(使用不知名的優化實現):
- Haraka-v2 256-5:55.2ms
- Haraka-v2 256-6:69.9 毫秒
您可以使用HighwayHash。它是一種基於 SIMD 的快速鍵控散列函式(比SipHash快 5 倍),具有安全聲明,適用於散列短輸入。
您嘗試過 SipHash,尤其是縮減輪次的 SipHash-1-3 嗎?
它專為短輸入而設計,不需要密鑰擴展,在幾乎所有類型的架構上都很快,並且可以輸出 64 位或 128 位。
不過,這個名稱可能會讓人感到困惑:需要一個密鑰,但既然您提到這對您的案例來說不是問題,請試一試。