密码学系列之:memory-bound函数
文章目錄
- 簡介
- 內存函數
- 內存受限函數
- 內存受限函數的使用
簡介
memory-bound函數可以稱為內存受限函數,它是指完成給定計算問題的時間主要取決于保存工作數據所需的內存量。和之相對應的就是計算受限compute-bound的函數,在計算受限的函數中,計算所需要的計算步驟是其決定因素。
本文將會介紹一下內存受限函數和它跟內存函數的關系。
內存函數
內存函數和內存受限函數看名字好像很類似,其實他們的作用是不同的,我們先來看下內存函數。
在學習算法中,有一個非常簡單好用的算法叫做遞歸算法,熟悉遞歸算法的朋友可能都知道,遞歸算法雖然好用,但是有個缺點就是會重復計算遞歸過程中的函數,比如說遞歸中最經典的斐波拉赫數列:
Recursive_Fibonacci (n){if (n == 0)return 0if (n == 1)return 1return 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-1results[i] = -1 // -1 means undefinedreturn 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 = 0else if (n == 1)val = 1elseval = 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/
最通俗的解讀,最深刻的干貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!
總結
以上是生活随笔為你收集整理的密码学系列之:memory-bound函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Pandas高级教程之:GroupBy用
- 下一篇: 架构之:REST和RESTful