我开始学习JavaScript的函数式编程。这可能是一个愚蠢的问题,但是我正在尝试解决以功能方式编写的非纯函数的问题。
我的问题是在功能编程范例中应采用什么策略来实现这一目标。
const crypto = require('crypto');
const encrypt = (data, publicKey) => {
if (publicKey === undefined ) throw 'Missing public key.';
const bufferToEncrypt = Buffer.from(data);
const encrypted = crypto.publicEncrypt({
key: publicKey
}, bufferToEncrypt);
return encrypted;
};
答案 0 :(得分:3)
成为纯函数有两个条件。
在进行非对称加密时这是不可能的,因为会为每个操作生成一个随机会话密钥。使用公共密钥对会话密钥进行加密,然后使用会话密钥对有效负载进行加密。返回的值通常只是两个值的编码版本:(1)用pubkey加密的会话密钥,以及(2)用session密钥加密的有效负载。
每次调用函数时,这两个值都会有所不同,因为会话密钥每次都将有所不同。
但是,尽管返回值的比较不相等,但我还是认为它们在上是相等的-也就是说,如果您使用匹配的私钥解密每个值,则解密后的值将进行比较相等。
加密实际上混淆了值相等,并且对于加密来说是一件好事。我们不希望在不同时间比较两个生成的加密消息,而没有 em>具有解密密钥。那会带来安全风险。
因此,我认为该函数在语义上符合此条件,但是没有公钥我们无法分辨。
这一点应该很明显:写入磁盘是一个副作用,写入全局变量是一个副作用,等等。在调用该函数之前和之后,我们都不能区分状态的任何差异
从技术上讲,将需要使用系统的安全随机数生成器来生成会话密钥。这将消耗一些熵。运行该功能后,熵将减少,可以测量。
但是,我认为可以忽略此副作用,因为任何需要安全随机数的东西都会遇到相同的问题,而这更多是实现细节< / em>安全随机数生成器。
这就像声称一个需要大量CPU时间的函数具有副作用,因为运行该函数会增加该进程的CPU时间计数器。这是副作用吗?从技术上来说...也许吗?但是没有理性的人会认为这是副作用。
我将此功能称为“纯粹意义上的”。如果您问我这是否是纯函数,并且只接受没有条件的是/否答案,我会告诉您“是”。