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

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

0
ClojureScript

{{random-uuid}} 当前通过 {{Math/random}} 经过 {{rand-int}} 使用 {{Math/random}} 为 v4 UUID 生成随机数。此补丁旨在在使用时采用加密强随机数生成器(伪随机数生成器)。

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

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

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

一个悬而未决的问题是节点.js {{crypto}} 模块如何可用,因为 ClojureScripts {{core.cljs}} 看起来似乎没有条件 {{require}} 节点.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,该补丁移除了* }开关,并将{{js/window}}替换为{{goog.global}},如David的评论所述。

此补丁还使用{{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上的问题,因为我无法使用{{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
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 发表评论:

添加了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 (/)

...