请在Clojure 2024 调查问卷中分享您的想法!

欢迎coming! 请访问关于页面以了解有关如何工作的更多信息。

0
ClojureScript

{{random-uuid}}当前通过{{Math/random}}和{{rand-int}}使用{{Math/random}}生成随机数用于v4 UUID。本补丁旨在使用可用的密码学强PRNG(伪随机数生成器)。

使用的函数包括
IE11中的{{window.msCrypto.getRandomValues}}

不支持前者或Node.js上未提供加密模块的浏览器中的{{Math/random}}

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

Google Closure似乎不提供对加密API的功能检测或包装,因此附加的补丁提案基于功能检测实现了一个shim。

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

17 个回答

0

由:dnolen发表评论

一些初步反馈没有切换到目标,只做功能检测即可。不要使用js/window,使用goog.global

0

由:aralo发表评论

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

可能超出范围,但如果不是使用str,我们可以通过手动使用(.join ... "")(.join ... "-")来提高一些速度。

0

评论由:abp 提出

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

此补丁还像我之前建议的那样使用了 {{js-mod}} 而不是 {{mod}},并添加了关于 {{random-uuid}} 行为的 docstring。
我也可以实现 {{.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. 对于 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中条件性地引用crypto库。
0

评论由:abp 提出

对前几天提交的糟糕补丁表示歉意,一直都很匆忙。
附带的0003-CLJS-2386-remove-node.patch修复了A. Rs最新的发现。

0

评论由:abp 提出

附带的0004-CLJS-2386-join-array.patch在{{array}}上使用{{.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中的漏洞,并取代了它。

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
by

评论由:abp 提出

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

0
by

评论者:mfikes

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

...