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

欢迎!请参阅 关于 页面以了解有关该功能的一些更多信息。

0
ClojureScript

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

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

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

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

一个悬而未决的问题是 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,移除了* }切换,并按David的评论将{{js/window}}替换为{{goog.global}}。

此补丁还使用{{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}}。crypto需要解析到某个东西。现在可以先省略这个{{nodejs}}情况。除非David能提供更好的建议,如何有条件地要求在node中使用crypto库。
0

评论者:abp

对不起,过去两天补丁质量较差,一直都很匆忙。
附加的 0003-CLJS-2386-remove-node.patch 修复了 A. Rs 最新发现的问题。

0

评论者:abp

附加的 0004-CLJS-2386-join-array.patch 使用了 {{.join}} 在 {{array}} 上而不是 {{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

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

0007-CLJS-2386-fix-rand-array-len.patch 也适用于最新主分支

0

评论者:abp

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

0

评论者:mfikes

0008-CLJS-2386-fix-ie.patch通过了CI测试(/)

...