密码学系列之: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/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

密码学系列之:memory-bound函数的更多相关文章

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

    密码学系列之:memory-hard函数 目录 简介 为什么需要MHF Memory hard的评估方法 MHF的种类 MHF的密码学意义 memory-hard在MHF中的应用 简介 Memory ...

  2. shell编程系列6--shell中的函数

    shell编程系列6--shell中的函数 .函数介绍 linux shell中的函数和大多数编程语言中的函数一样 将相似的任务或者代码封装到函数中,供其他地方调用 语法格式 第一种格式 name() ...

  3. 密码学系列之:碰撞抵御和碰撞攻击collision attack

    密码学系列之:碰撞抵御和碰撞攻击collision attack 简介 hash是密码学和平时的程序中经常会用到的一个功能,如果hash算法设计的不好,会产生hash碰撞,甚至产生碰撞攻击. 今天和大 ...

  4. 密码学系列之:feistel cipher

    密码学系列之:feistel cipher 简介 feistel cipher也叫做Luby–Rackoff分组密码,是用来构建分组加密算法的对称结构.它是由德籍密码学家Horst Feistel在I ...

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

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

  6. 进程间通信系列 之 消息队列函数(msgget、msgctl、msgsnd、msgrcv)及其范例

    进程间通信系列 之 概述与对比   http://blog.csdn.net/younger_china/article/details/15808685  进程间通信系列 之 共享内存及其实例   ...

  7. 智能合约语言 Solidity 教程系列10 - 完全理解函数修改器

    这是Solidity教程系列文章第10篇,带大家完全理解Solidity的函数修改器. Solidity系列完整的文章列表请查看分类-Solidity. 写在前面 Solidity 是以太坊智能合约编 ...

  8. 密码学系列之:Merkle–Damgård结构和长度延展攻击

    密码学系列之:Merkle–Damgård结构和长度延展攻击 简介 Merkle–Damgård结构简称为MD结构,主要用在hash算法中抵御碰撞攻击.这个结构是一些优秀的hash算法,比如MD5,S ...

  9. 密码学系列之:海绵函数sponge function

    目录 简介 海绵函数的结构 海绵函数的应用 简介 海绵函数sponge function是密码学中使用的一种函数,它接收一定长度的输入,然后输出一定长度的输出,中间包含了有限个内部状态. 因为海绵函数 ...

随机推荐

  1. MindSpore激活函数总结与测试

    技术背景 激活函数在机器学习的前向网络中担任着非常重要的角色,我们可以认为它是一个决策函数.举个例子说,我们要判断一个输出的数据是猫还是狗,我们所得到的数据是0.01,而我们预设的数据中0代表猫1代表 ...

  2. JavaScript正则表达式(深度)(Day_14)

    忘不掉的是回忆,继续的是生活,错过的,就当是路过. 简介 正则表达式是用于匹配字符串中字符组合的模式.在 JavaScript中,正则表达式也是对象. 这些模式被用于 RegExp 的 exec 和  ...

  3. Kubernetes集群搭建 ver1.20.5

    目录 部署方式 1. 基础环境准备 1.1 基础初始化 1.2 安装docker 2. 部署harbor及haproxy高可用反向代理 2.1 镜像加速配置 2.2 高可用master可配置 3. 初 ...

  4. Ajax|看这一篇就够了!详解Ajax工作原理及开发步骤

    传统开发的缺点,是对于浏览器的页面,全部都是全局刷新的体验.如果我们只是想取得或是更新页面中的部分信息那么就必须要应用到局部刷新的技术. 局部刷新也是有效提升用户体验的一种非常重要的方式. Ajax技 ...

  5. AlexeyAB DarkNet YOLOv3框架解析与应用实践(一)

    AlexeyAB DarkNet YOLOv3框架解析与应用实践(一) Darknet:  C语言中的开源神经网络 Darknet是一个用C和CUDA编写的开源神经网络框架.它速度快,易于安装,支持C ...

  6. 免费版对象存储【minIO】CentOS部署实践记录 2021

    好久没写,记录一下 1.背景 之前一直用的七牛,不过是收费的,然后有些定制化需求,可能比较看重预算,然后就有了这篇开源方式:minio 2.简介 官方文档:http://docs.minio.org. ...

  7. apache jmeter下载与安装

    JMeter是Apache软件基金会的产品,用于对静态的和动态的资源性能进行测试.jmeter可以运行在多个平台上,如Windows和Linux,本文讲的是在Windows安装jmeter. 工具/原 ...

  8. 工具篇:介绍几个好用的guava工具类

    前言 平时我们都会封装一些处理缓存或其他的小工具.但每个人都封装一次,重复造轮子,有点费时间.有没有一些好的工具库推荐-guava.guava是谷歌基于java封装好的开源库,它的性能.实用性,比我们 ...

  9. Python编解码问题与文本文件处理

    编解码器 在字符与字节之间的转换过程称为编解码,Python自带了超过100种编解码器,比如: ascii(英文体系) gb2312(中文体系) utf-8(全球通用) latin1 utf-16 编 ...

  10. 高吞吐、低延迟 Java 应用的 GC 优化实践

    本篇原文作者是 LinkedIn 的 Swapnil Ghike,这篇文章讲述了 LinkedIn 的 Feed 产品的 GC 优化过程,虽然文章写作于 April 8, 2014,但其中的很多内容和 ...