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

欢迎!请参阅 关于 页面以获取更多关于此的工作信息。

0
ClojureScript

{{random-uuid}} 当前是通过 {{Math/random}} 并通过 {{rand-int}} 生成随机数用于 v4 UUID。此补丁目标是如果可用,则使用密码学上安全的 PRNG (伪随机数生成器)。

使用的函数是
IE11 中的 {{window.msCrypto.getRandomValues}}
* 在不支持前者的浏览器或节点.js 上未提供加密模块的情况下,使用 {{Math/random}}

目前未使用
* 在节点.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 数组保证它们是正数?

可能超出范围,但我们可以通过手动使用 (.join ... "")(.join ... "-") 来代替 str 以获得一些速度上的提升。

0

评论者:abp

添加 0001-CLJS-2386-no-target-js-mod.patch,该补丁移除了 * } 开关,并按照 David 的评论将 {{js/window}} 替换为 {{goog.global}}。

这个补丁还使用了 A.R. 建议的 {{js-mod}} 而不是 {{mod}},并为 {{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 中条件性引入加密库的良好建议。
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

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

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

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

...