gpt4 book ai didi

javascript - 在 JavaScript 中将非纯函数转换为纯函数的策略是什么

转载 作者:行者123 更新时间:2023-11-29 18:40:11 25 4
gpt4 key购买 nike

我开始学习使用 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:调用具有相同值的函数必须始终产生相同的返回值

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

每次调用该函数时,这两个值都会不同,因为 session key 每次都会不同。

然而,尽管返回值不相等,但我认为它们在语义上相等——也就是说,如果您使用匹配的私钥解密每个值,解密后的值将比较平等。

加密有效地混淆了值是否相等,对于加密来说,这是一件好事。我们不希望比较在不同时间生成的两条加密消息em> 具有解密 key 。那将是一个安全风险。

因此,我认为此函数在语义上符合此标准,但如果没有公钥我们无法判断。

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

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

从技术上讲, session key 的生成将需要使用系统的安全随机数生成器。这将消耗一些熵。运行该函数后,可用的熵将减少,这可以测量。

但是,我认为可以忽略这种副作用,因为任何需要安全随机数的东西都会有同样的问题,而这更像是一个实现细节 安全随机数生成器。

这就像声称需要大量 CPU 时间的函数有副作用,因为运行它会增加进程的 CPU 时间计数器。是副作用吗?技术上……也许?但任何有理智的人都不会认为这是副作用。

结论

我将此函数称为“语义纯”。如果你问我这是否是一个纯函数并且只接受没有限定条件的是/否答案,我会告诉你"is"。

关于javascript - 在 JavaScript 中将非纯函数转换为纯函数的策略是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57779904/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com