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

欢迎!有关此过程的更多信息,请参阅 关于 页面。

0
ClojureScript

目前,{{random-uuid}} 通过 {{Math/random}} 和 {{rand-int}} 使用 {{Math/random}} 生成 v4 UUID 的随机数。此补丁的目标是使用一个加密安全的 PRNG(伪随机数生成器),如果可用。

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

目前未使用
* Node.js 中的 {{crypto.randomBytes}}

Google Closure 似乎不提供功能检测或加密-API 的包装器,因此附带的补丁建议实现了一个基于功能检测的垫片。

一个悬而未决的问题是 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
by

评论者:abp

添加了0001-CLJS-2386-no-target-js-mod.patch,该.patch移除了* }开关,并将{{js/window}}替换为{{goog.global}},如David的评论所说。

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

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

0
by

评论由:aralo 提供

@Adrian:不要使用{{goog.global.window}},因为{{goog.global}}在浏览器中已经是{{window}}对象。它之所以能工作,是因为窗口对象也保持对自己的引用,所以你可以写{{js/window.window.window.window.crypto}}。目前你的代码在nodejs上无法工作。

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

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

0
by

评论者:abp

哦,那个搜索/替换出错了,甚至没有打算这样做,测试成功的原因是你解释的那样,将修复它。

0
by
_评论者:abp_

0002-CLJS-2386-remove-window.patch修复了A.R.提出的问题,重构{{.join}} Still postponed。

@A.R.关于node上的{{(exists? crypto)}},由于它是一个模块,我不能使用{{goog.global}},对吗?感谢帮助/评论!
0
by
_评论者:aralo_

1. 没有必要检查{{goog.global}},它将存在
2. 你检查{{goog.global.msCrypto.getRandomValues}},但随后调用{{goog.global.crypto.getRandomValues}}
3. 你不能这样检查{{(exists? crypto) ;; nodejs}}对节点模块来说。crypto必须解析为某物。目前,先省略这个{{nodejs}}情况。除非David能提供更好的关于如何在node中条件性要求加密库的 advice。
0

评论者:abp

为最近两天提交的糟糕补丁表示歉意,一直都很急忙。
附加的0003-CLJS-2386-remove-node.patch修复了A. Rs的最新发现。

0

评论者:abp

附加的0004-CLJS-2386-join-array.patch使用{{.join}}在{{array}}上而不是{{str}}。

另一种实现方法是生成随机数后,将{{Uint8ClampedArray}}转换为普通数组,然后直接在原地执行{{aset}}字符串转换和{{.join}}。但我不确定这样做是否会更高效,以及如何将类型化数组转换为普通数组。

0

评论者:abp

0005-CLJS-2386-join-aset.patch应该更高效,因为它不使用闭包来从类型化数组中访问随机值。它只是生成带有随机值的未/类型化数组,然后将这些数组转换为未类型化数组并执行{{.join}}。

0

评论者:abp

0006-CLJS-2386-fix-join-aset.patch修复了0005-CLJS-2386-join-aset.patch中的一个错误。

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测试(/)

...