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

欢迎!请查看 关于 页面,了解更多关于这个网站的信息。

0
ClojureScript

当前,{{random-uuid}} 使用 {{Math/random}} 中的 {{rand-int}} 通过生成随机数字为 v4 UUID。此补丁旨在使用可用的加密强伪随机数生成器(pseudo random number generator)。

使用的函数包括
IE11 中的 {{window.msCrypto.getRandomValues}}
* 不支持前者或如果 crypto 模块未在 Node.js 中提供,则使用 {{Math/random}}

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

Google Closure 似乎未提供功能检测或 crypto-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,移除了* }开关,并将{{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. 对于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中条件性地require一个crypto库。
0

评论由:abp

抱歉最近两天代码质量不佳,总是匆忙。
附上的0003-CLJS-2386-移除-node.patch修复了A. Rs最新的发现。

0

评论由:abp

附上的0004-CLJS-2386-join-array.patch使用了一个数组而非字符串来调用{{.join}}。

另一种实现方法是在生成随机数后将{{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 fixing a bug in {{random-uuid-vals}} where not enough random numbers were generated when {{crypto.getRandomValues}} is not available.

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 (/)

...