文章目录

  • 简介
  • 内存函数
  • 内存受限函数
    • 内存受限函数的使用

简介

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函数相关推荐

  1. 密码学系列之:memory-hard函数

    文章目录 简介 为什么需要MHF Memory hard的评估方法 MHF的种类 MHF的密码学意义 memory-hard在MHF中的应用 简介 Memory hard function简称为MHF ...

  2. 现代密码学5.4--对哈希函数的攻击

    现代密码学5.4--对哈希函数的攻击 生日攻击 生日问题 博主正在学习INTRODUCTION TO MODERN CRYPTOGRAPHY (Second Edition) --Jonathan K ...

  3. 密码学系列之:SAFER

    简介 分组密码是一个非常优秀的加密结构,很多常用加的加密算法使用的都是分组算法,比如DES.SAFER表示的也是一种分组密码算法.一起来看看吧. SAFER简介 SAFER的全称是Secure And ...

  4. 密码学系列之:Argon2加密算法详解

    文章目录 简介 密钥推导函数key derivation function Password Hashing Competition Argon2算法 Argon2的输入参数 处理流程 简介 Argo ...

  5. 《密码学系列》—— 分组密码

    我无论做什么,始终在想着,只要我的精力允许我的话,我就要首先为我的祖国服务.--<巴甫洛夫选集> 本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues. https:// ...

  6. 密码学系列 - 可验证时延加密算法(VDF)

    可验证时延加密函数(Verifiable Time-Delay Encoding Function): VDF有两大要求,即时间要求(加密时间长,而解密时间短)和可验证要求(证明与验证过程高效).目前 ...

  7. 密码学系列——MD5算法理解记录

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 密码学系列--MD5算法理解记录 前言 MD5算法流程 总结 前言 主要是为了快速回忆之前工作的一些记录,不至于完全忘记.因此此处不会 ...

  8. view函数_数据科学系列:数据处理(6)字符串函数基于R(二)

    承接R&Python Data Science系列:数据处理(5)--字符串函数基于R(一),继续介绍R语言中的字符串函数. 4.2 R语言中的正则表达式 正则表达式通过各种函数对字符串进行查 ...

  9. oracle软件工程,.Net软件工程师学用Oracle系列(9):系统函数(上)

    .Net程序员学用Oracle系列(9):系统函数(上) 本文大纲 众所周知,Oracle 中系统函数特别多,貌似有好几百个,但实际上大部分函数对于普通应用而言,永远都用不到,本文将主要介绍 Orac ...

  10. 密码学系列(一):密码行业、政策介绍

    密码学系列(一):密码行业.政策介绍 管理部门 <密码法>(19年) <密码法>具体章节 第3章 商用密码 第4章 法律责任 相关零散知识 管理部门 国家密码管理局--商密办- ...

最新文章

  1. gj5 自定义序列类
  2. mysql创建分区是否存在_mysql中如何判断是否支持分区
  3. SynchronizationContext
  4. jspwiki mysql_Wiki.js初体验
  5. 新的JMetro JavaFX 11兼容版本
  6. Android 更改签名
  7. a的n次方的最后三位数c语言,求13的n次方(12n≤130000000000)的最后三位数,用c++编程...
  8. 史上最全JavaScript数组去重的十种方法(推荐)
  9. c语言用指针取出字节,在C语言中一个指针占用多少字节。
  10. 苹果x屏幕多少钱_xsmax闪屏,苹果xsmax换屏幕多少钱
  11. 英语背单词有用吗_学英语千万不要背单词 背单词有效吗
  12. IR(红外遥控)基本原理
  13. 2020秋招 携程算法岗笔试编程题解答
  14. DDR MC DFI PHY
  15. 阿里云服务器租用价格表最新发布,持续更新
  16. 快速上手ndk开发! Mac/Win下配置和使用!(2018.4重编版)
  17. 【比赛回顾】广工大2020级年ACM第一次月赛——Dio的面包工坊
  18. 微信公众平台后台数据如何分析
  19. writev遇到非阻塞IO
  20. distill介绍及优秀博客记录

热门文章

  1. 散列表的设计与实现_散列表:如何实现word编辑器的拼写检查?
  2. Linux服务器下使用命令行登录校园网(深大为例)
  3. 离散对数(关于方程x^A=B(mod C)的解)
  4. 梅朵是藏语鲜花的意思
  5. 判断程序是否运行在虚拟机中的代码
  6. IDA来远程调试Linux程序
  7. (十一)boost库之多线程间通信
  8. 关于 AfxSocketInit() 的使用
  9. scrapy去重原理,scrapy_redis去重原理和布隆过滤器的使用
  10. JAVA通过反射获取方法真实参数名