2024 年 Clojure 状态调查!分享您的想法。

欢迎!请参阅关于页面以了解更多关于它是如何工作的信息。

0
ClojureScript

{{random-uuid}} 当前通过 {{Math/random}} 和 {{rand-int}} 使用来为 v4 UUIDs 生成随机数。此补丁旨在在使用可用的情况下使用密码学安全的 PRNG(伪随机数生成器)。

所使用的函数是
{{window.crypto.getRandomValues}} 在大多数浏览器中
{{window.msCrypto.getRandomValues}} 在 IE11 中
* {{Math/random}} 在不支持前者或 Node.js 上未提供crypto模块的浏览器中

当前未使用
* {{crypto.randomBytes}} 在 Node.js 中

Google Closure 似乎没有提供功能检测或用于crypto-APIs的包装器,因此附带的补丁提案基于功能检测实现了一个shim。

一个开放问题是Node.js {{crypto}}模块如何使其可用,因为ClojureScripts {{core.cljs}} 似乎没有条件 {{require}} Node.js模块,也许应该保持这种状态。

17 答案

0

评论由:dnolen 提供

一些初步反馈不会根据目标进行切换,只需做功能检测即可。不要用 js/window,用 goog.global

0

评论由:aralo 提供

我们应该使用 js-mod,因为 UInt8 数组保证它们是正数吗?

可能超出了范围,但我们可以手动使用 (.join ... "")(.join ... "-") 来获取一些速度提升,而不是使用 str

0

评论者:abp

添加了0001-CLJS-2386-no-target-js-mod.patch,该补丁删除了* }开关,并按照Dave的评论将{{js/window}}替换为{{goog.global}}。

此补丁还像A.R.建议的那样使用{{js-mod}}而不是{{mod}},并为{{random-uuid}}添加了说明行为的文档字符串。
我也可以实现{{.join}}建议,但现在不行。

已更新票据描述以反映当前状态。

0

评论由:aralo 提供

@Adrian:不要使用{{goog.global.window}},因为当在浏览器中时,{{goog.global}}已经是{{window}}对象了。这碰巧行得通,因为window对象还保留对自己的引用,所以你可以写成{{js/window.window.window.window.crypto}}。目前你的代码在nodejs中不会工作。

所以只需使用{{goog.global.crypto}},并像之前那样使用{{js/Uint8ClampedArray}}。

@David:我们可能需要在{{js-in}}宏周围添加一个{{bool-expr}},然后我们可以用它来编写功能检测代码。

0

评论者:abp

哦,那个搜索/替换出错了,甚至不是故意的,测试成功了,原因是您解释的那样,将修复它。

0
_评论者:abp_

0002-CLJS-2386-remove-window.patch修复了A. R.指出的问题,{{.join}}重构仍然被推迟。

@A. R.对于节点上的{{(exists? crypto)}},我不能使用{{goog.global}},因为它是一个模块,对吧?感谢帮助/审阅!
0
_评论者:aralo_

1. 没有必要检查{{goog.global}},它将存在
2. 你正在检查{{goog.global.msCrypto.getRandomValues}},但随后调用{{goog.global.crypto.getRandomValues}}
3. 您不能像这样检查节点模块 ({{(exists? crypto) ;; nodejs}})。`crypto` 必须解析为某个值。目前请忽略这个 {{nodejs}} 情况。除非 David 能够提供更好的建议,说明如何在 Node 中条件性引入加密库。
0

评论者:abp

抱歉最近两天提交的补丁质量不高,总是很匆忙。
附件 0003-CLJS-2386-remove-node.patch 修复了 A. Rs 最新发现的问题。

0

评论者:abp

附件 0004-CLJS-2386-join-array.patch 使用 {{.join}} 替代 {{str}}

另一种实现可以是生成随机数后将 {{Uint8ClampedArray}} 转换为常规数组,然后在原地执行字符串转换并将结果 {{.join}}。

0

评论者:abp

0005-CLJS-2386-join-aset.patch 的效率应该更高,因为它不使用闭包从 typed 数组访问随机值。它仅生成包含随机值的未/类型化数组,然后将其转换为未类型化数组并使用 {{.join}}。

0

评论者:abp

0006-CLJS-2386-fix-join-aset.patch 修正了 0005-CLJS-2386-join-aset.patch 中的 bug 并取代了它。

0

评论者:mfikes

0006-CLJS-2386-fix-join-aset.patch 不再适用

0

评论者:abp

添加了 0007-CLJS-2386-fix-rand-array-len.patch,其中包含修复 {{random-uuid-vals}} 中一个错误的补丁,当 {{crypto.getRandomValues}} 不可用时生成的随机数不足。

0007-CLJS-2386-fix-rand-array-len.patch 也适用于最新的 master。

0

评论者:abp

添加了0008-CLJS-2386-fix-ie.patch,移除了对{{Uint8ClampedArray}}的使用,这会导致IE11在{{msCrypto getRandomValues}}中抛出{{TypeMismatchError}}错误。还从其他浏览器的实现中移除了{{Uint8ClampedArray}},因为它不是必要的。

0

评论者:mfikes

0008-CLJS-2386-fix-ie.patch通过了CI (/)

...