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

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

0投票
ClojureScript

{{random-uuid}}当前使用{{Math/random}}通过{{rand-int}}为v4 UUID生成随机数。此补丁的目的是如果可用,则使用加密强伪随机数生成器(PRNG)。

使用的函数是
大多数浏览器中的{{window.crypto.getRandomValues}}
IE11中的{{window.msCrypto.getRandomValues}}
不支持前者的浏览器或如果Node.js中的crypto模块不可用,则使用{{Math/random}}。

目前未使用
不支持Node.js的crypto模块时,使用{{crypto.randomBytes}}

Google Closure似乎没有提供功能检测或crypto-API的包装器,因此附加的补丁提案根据功能检测实现了一个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,它删除了* }开关,并根据Davids的评论将{{js/window}}替换为{{goog.global}}。

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

已更新任务说明以反映当前状态。

0投票

评论者: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投票

评论由:abp

那个搜索/替换搞错了,也不是故意的,测试成功的原因是你解释的那样,我会修复它。

0投票
_评论由:abp_

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

@A. R.在node上的{{(exists? crypto)}}中不能使用{{goog.global}},因为它是一个模块,对吗?感谢您的帮助/评论!
0投票
_评论由:aralo_

1. 没有必要检查{{goog.global}},它将存在。
2. 你正在检查{{goog.global.msCrypto.getRandomValues}},但随后调用了{{goog.global.crypto.getRandomValues}}。
3. 你不能这样检查{{(exists? crypto) ;; nodejs}},对于node模块来说。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}}转换为常规数组,然后在字符串转换处直接{{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中的一个bug,并替代了它。

0投票

评论者:mfikes

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

0投票

评论由:abp

增加了0007-CLJS-2386-fix-rand-array-len.patch,其中包含修复{{random-uuid-vals}}的一个bug,在{{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测试

...