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

欢迎!请参见 关于 页面以了解更多关于该工具的信息。

0
ClojureScript

{{random-uuid}} 目前使用 {{Math/random}} 通过 {{rand-int}} 生成用于 v4 UUIDs 的随机数。此补丁旨在使用可用的密码学强度足够的 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}} 似乎没有 Node.js 模块的条件 {{require}},也许应该保持这种方式。

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}}。

此补丁还像A.R.建议的那样使用{{js-mod}}而不是{{mod}},并为{{random-uuid}}添加了文档字符串,说明了行为。
我也可以实现{{.join}}的建议,但现在还不行。

已更新工单描述以反映当前状态。

0

评论来自:aralo

Adrian:不要使用{{goog.global.window}},因为{{goog.global}}在浏览器中已经是{{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

评论由:abp 提出

对不起昨天和今天补丁质量较差,总是很匆忙。
附带的0003-CLJS-2386-remove-node.patch修复了A. Rs的最新发现。

0

评论由:abp 提出

附带的0004-CLJS-2386-join-array.patch使用{{.join}}在{{array}}上代替{{str}}

另一个可能的实现是将{{Uint8ClampedArray}}在生成随机数字后转换为常规数组,然后在原地进行字符串转换和{{.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

...