密碼學系列之:memory-bound函式

flydean發表於2021-07-14

密碼學系列之:memory-bound函式

簡介

memory-bound函式可以稱為記憶體受限函式,它是指完成給定計算問題的時間主要取決於儲存工作資料所需的記憶體量。和之相對應的就是計算受限compute-bound的函式,在計算受限的函式中,計算所需要的計算步驟是其決定因素。

本文將會介紹一下記憶體受限函式和它跟記憶體函式的關係。

記憶體函式

記憶體函式和記憶體受限函式看名字好像很類似,其實他們的作用是不同的,我們先來看下記憶體函式。

在學習演算法中,有一個非常簡單好用的演算法叫做遞迴演算法,熟悉遞迴演算法的朋友可能都知道,遞迴演算法雖然好用,但是有個缺點就是會重複計算遞迴過程中的函式,比如說遞迴中最經典的斐波拉赫數列:

 Recursive_Fibonacci (n)
 {
     if (n == 0)
         return 0
     if (n == 1)
         return 1

     return Recursive_Fibonacci (n-1) + Recursive_Fibonacci (n-2)
 }

很簡單,但是我們來考慮下計算過程,F(3)=F(2)+F(1), 而F(4)=F(3)+F(2),在這個過程中需要計算2次F(2)的值。如果計算的N值夠大的話,重複計算的值還會更多。

一個解決方法就是將之前計算過的結果使用記憶體存起來,這種方法就叫做記憶體函式:

 Fibonacci (n)
 {
     for i = 0 to n-1
         results[i] = -1  // -1 means undefined

     return Fibonacci_Results (results, n);
 }

 Fibonacci_Results (results, n)
 {
     if (results[n] != -1)  // If it has been solved before,
         return results[n]  // look it up.
     if (n == 0)
         val = 0
     else if (n == 1)
         val = 1
     else
         val = Fibonacci_Results(results, n-2 ) + Fibonacci_Results(results, n-1)
     results[n] = val  // Save this result for re-use.

     return val
 }

雖然直接遞迴的邏輯很簡單,寫起來也很方便,但是它的時間複雜度會更高。

記憶體受限函式

記憶體受限函式主要用來描述一個使用XOR的函式,它由一系列計算組成,其中每一次計算都依賴於前一次計算。

因為這樣的記憶體依賴關係,所以記憶體受限函式主要用在密碼學中,可以防止密碼的暴力破解工作。

下面舉個記憶體受限函式在防止垃圾郵件中的使用。

記憶體受限函式的使用

使用記憶體受限函式來防止垃圾郵件,主要使用的是POW的原理,也就是說,你可以給我發垃圾郵件,但是前提是需要付出一些代價。

當然,最初的防垃圾郵件的原理是使用CPU受限函式。

1992年,IBM的研究科學家Cynthia Dwork和Moni Naor在CRYPTO上發表了一篇題為《通過定價來阻止垃圾郵件》的論文,他們提出了一種利用CPU受限函式的功能來阻止濫用者傳送垃圾郵件的可能性。

該方案的原理是:如果濫發郵件的成本很低,那麼垃圾郵件就可能橫行。如果能夠通過以昂貴的CPU計算的形式為傳送郵件新增額外的計算成本,就可以減少垃圾郵件。使用CPU受限函式,使得每發一次郵件都需要消耗一定的CPU資源,從而防止在短時間內傳送大量的垃圾郵件。

CPU受限函式是一種突破,但是也有其缺點。

因為快CPU的計算速度比慢CPU快得多。此外,高階計算機系統也有複雜的流水線和其他有利於計算的優化功能。因此,擁有高階系統的垃圾郵件傳送者幾乎不會受到這種CPU受限函式的影響。

從而會因為不同使用者機器效能的不同,導致非常大的計算時間差異。比如如果一個演算法在高階計算機上需要幾秒鐘,那麼在老的計算機上可能需要1分鐘,而在效能更差點的手機上可能會需要幾分鐘,那麼這個演算法肯定是無法被手機使用者接受的。

因此,研究者們關注的是如何找到一種在大多數計算機系統都以大致相同的速度執行的函式,雖然在高階計算機上速度會更快,但也只是稍微快一點而已,不是幾何級數的快,那麼就可以在容忍範圍之內。

這種方法就是使用記憶體受限函式。記憶體受限函式是指計算時間由訪問記憶體的時間支配的函式。記憶體受限函式以一種不可預測的方式訪問大記憶體區域的位置,從而無法使用快取來提升效能。

使用記憶體受限而不是CPU受限也有其工業上的原因,近年來,雖然CPU的計算速度急劇增長,但在開發更快的主記憶體方面進展相對較小。所以可以預見,在未來的一定時間內,記憶體受限函式還會有越來越多的應用場景。

本文已收錄於 http://www.flydean.com/memory-bound/

最通俗的解讀,最深刻的乾貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!

相關文章