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.randomBytes}}在Node.js中

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投票

评论者:abp

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

此补丁还使用{{js-mod}}而不是{{mod}},如A.R.所建议,并添加了{{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)}}在node上的node模块,我不能使用{{goog.global}},因为它是一个模块,对吧?感谢帮助/审查!
0投票
_评论者:aralo_

1. 没有理由检查{{goog.global}},它将存在
2. 您正在检查{{goog.global.msCrypto.getRandomValues}},但随后调用{{goog.global.crypto.getRandomValues}}
3. 您不能像这样检查{{(exists? crypto) ;; nodejs}} for node模块。crypto必须解析为某物。因此现在可以省略此{{nodejs}}情况。除非David能给出关于如何在node中条件地要求crypto库的更好建议。
0投票

评论者:abp

对于最近两天不良的补丁,我总是很急。
附上0003-CLJS-2386-remove-node.patch以修复A. Rs的最新的发现。

0投票

评论者:abp

附上0004-CLJS-2386-join-array.patch使用{{.join}}来实现{{array}}而不是{{str}}

另一种实现方法可能是在生成随机数后将{{Uint8ClampedArray}}转换为常规数组,然后在原地进行字符串转换并{{.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}},这在{{msCrypto.getRandomValues}}中会导致IE11抛出{{TypeMismatchError}}。同时,也从其他浏览器实现中移除了{{Uint8ClampedArray}},因为它不是必需的。

0投票

被mfikes评论:

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

...