HMACSHA256 比 HMACSHA512 快 2.5 倍
根據上一個問題的答案,512 版本在 x64 設備上應該**更快。**即使它是在 x86(32 位)設備上執行的,也不應該有這麼大的區別。
這種差異有什麼解釋嗎?(或者它必須是一個實施問題。)
以下程式碼為 HMACSHA512 返回近 5 秒,為 HMACSHA256 返回近 2 秒:(它在 具有“CPU 位架構 64 位”的Snapdragon 410 處理器的三星 J5(2015)上執行。使用 Xamarin.Forms PCL,機器人項目。):
private void Button_Clicked(object sender, EventArgs e) { ICrypto crypto = DependencyService.Get<ICrypto>(); Stopwatch watch = new Stopwatch(); byte[] b = new byte[64]; watch.Start(); for (int i = 0; i < 10000; i++) { b = crypto.CalculateHmac512(b); } watch.Stop(); label.Text = watch.ElapsedMilliseconds.ToString(); }
和
class Crypto : ICrypto { //HMACSHA256 hmac = new HMACSHA256(); HMACSHA512 hmac = new HMACSHA512(); public byte[] CalculateHmac512(byte[] m) { return hmac.ComputeHash(m); } }
(在 64 位 PC 上進行 100,000 次迭代,512 大約需要 200 毫秒,256 大約需要 130 毫秒。所以我猜 Xamarin 本身是 32 位的。但這仍然不能解釋 x2.5 在 Android 上的差異。)
SHA-512 內部散列 128 個八位字節的塊,而 SHA-256 為 64 個。就每秒散列的八位字節而言,這可以在 64 位 CPU 上提供速度優勢,但僅適用於大型消息。我會嘗試 8192 那裡有 64 和 200 那裡有 10000。
SHA-512 壓縮函式通常需要比 SHA-256 多得多的時間:結構很接近,變數大小是原來的兩倍,有 80 輪而不是 64 輪(多 25%)。還有大約兩倍的數據移動,這通常會產生一些懲罰。但是,總體所需的時間可能少於兩倍,並且由於對兩倍的消息進行雜湊處理,因此總體上對於大消息可能會有一些好處。
該問題將 HMAC-SHA-512 與 HMAC-SHA-256 進行了比較。與直接雜湊相比,HMAC 結構增加了至少 3 次壓縮(對於長密鑰更是如此),這進一步增加了消息大小門檻值,然後 64 位版本才有優勢。對於 64 字節的消息,HMAC-SHA-512 執行 4 次壓縮,而 HMAC-SHA-256 執行 5 次(兩者均為 320 輪)。對於 8192 個八位字節的消息,進行 68 次對 132 次壓縮(5440 次對 8448 輪),這給了 HMAC-SHA-512 一個機會。
此外,算法(尤其是加密)的速度在很大程度上取決於其實現的質量以及它與手頭硬體的適配程度。從我們的立場來看,我們甚至無法判斷是否
HMACSHA512
或HMACSHA256
是否是本機程式碼、即時編譯或解釋。對除本機程式碼以外的任何內容進行基準測試都是毫無意義的(如果性能真的很重要,關鍵部分應該是本機的)而且更難(結果往往不穩定)。