请在2024 Clojure状态调查中分享您的想法!

欢迎!有关如何使用本站的信息,请参阅关于页面。

0
ClojureScript

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

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

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

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

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

17 个答案

0

由:dnolen发表的评论

一些初始反馈不用target,请只做功能检测。不要使用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}}而不是A.R.建议的{{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}} 以确认模块。crypto 必须解析为某个东西。现在只需省略这个 {{nodejs}} 情况。除非 David 能给出有关如何在 Node 中有条件地要求依赖 crypto 库的更好建议。
0
by

评论者:abp

为过去两天糟糕的打补丁行为道歉,总是太匆忙了。
附加的 0003-CLJS-2386-remove-node.patch 修复了 A. Rs 的最新发现。

0
by

评论者:abp

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

另一个可能的实现是,在生成随机数字后将 {{Uint8ClampedArray}} 转换为普通数组,然后只 {{aset}} 字符串转换并 {{.join}} 结果。但我不确定这会更加高效,也不知道如何将类型化数组转换为普通数组。

0
by

评论者:abp

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

0
by

评论者:abp

0006-CLJS-2386-fix-join-aset.patch 修复了 0005-CLJS-2386-join-aset.patch 中的错误并取代了它。

0
by

评论者:mfikes

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

0
by

评论者:abp

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

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

0

评论者:abp

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

0

评论者:mfikes

0008-CLJS-2386-fix-ie.patch 通过 CI 测试。

...