什么策略将非纯函数转换为JavaScript中的纯函数

时间:2019-09-03 23:52:41

标签: javascript functional-programming pure-function

我开始学习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;

};

1 个答案:

答案 0 :(得分:3)

成为纯函数有两个条件。

纯函数准则1:以相同的值调用函数必须始终产生相同的返回值

在进行非对称加密时这是不可能的,因为会为每个操作生成一个随机会话密钥。使用公共密钥对会话密钥进行加密,然后使用会话密钥对有效负载进行加密。返回的值通常只是两个值的编码版本:(1)用pubkey加密的会话密钥,以及(2)用session密钥加密的有效负载。

每次调用函数时,这两个值都会有所不同,因为会话密钥每次都将有所不同。

但是,尽管返回值的比较不相等,但我还是认为它们在上是相等的-也就是说,如果您使用匹配的私钥解密每个值,则解密后的值将进行比较相等。

加密实际上混淆了值相等,并且对于加密来说是一件好事。我们不希望在不同时间比较两个生成的加密消息,而没有 em>具有解密密钥。那会带来安全风险。

因此,我认为该函数在语义上符合此条件,但是没有公钥我们无法分辨。

纯功能准则2:该功能没有可观察到的副作用

这一点应该很明显:写入磁盘是一个副作用,写入全局变量是一个副作用,等等。在调用该函数之前和之后,我们都不能区分状态的任何差异

从技术上讲,将需要使用系统的安全随机数生成器来生成会话密钥。这将消耗一些熵。运行该功能后,熵将减少,可以测量。

但是,我认为可以忽略此副作用,因为任何需要安全随机数的东西都会遇到相同的问题,而这更多是实现细节< / em>安全随机数生成器。

这就像声称一个需要大量CPU时间的函数具有副作用,因为运行该函数会增加该进程的CPU时间计数器。这是副作用吗?从技术上来说...也许吗?但是没有理性的人会认为这是副作用。

结论

我将此功能称为“纯粹意义上的”。如果您问我这是否是纯函数,并且只接受没有条件的是/否答案,我会告诉您“是”。