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

欢迎!请查看关于页面以了解此处的更多信息。

0
ClojureScript

当前,{{random-uuid}} 通过{{Math/random}}及{{rand-int}}在v4 UUIDs中生成随机数。此补丁旨在在可用时使用加密强伪随机数生成器。

使用的函数有
IE11上的 {{window.msCrypto.getRandomValues}}
* 如果不支持前一个或Node.js上的crypto模块不可用,则使用{{Math/random}}

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

Google Closure似乎不提供功能检测或crypto-APIs的包装器,因此附带的补丁提案基于功能检测实现了一个垫片。

一个未决问题是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,该补丁删除了* } switch,并将{{js/window}}替换为{{goog.global}},如David注释所述。

此补丁还使用{{js-mod}}而不是{{mod}},如A.R.建议的那样,并为{{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.在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中条件性引入一个crypto库的建议。
0

评论者:abp

抱歉前两天打了些不好的补丁,总是赶时间。
附加的0003-CLJS-2386-remove-node.patch修复了A. Rs的最新发现。

0

评论者:abp

附加的0004-CLJS-2386-join-array.patch使用了在{{array}}上的{{.join}}代替{{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}}中对bug的修复的0007-CLJS-2386-fix-rand-array-len.patch,当{{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测试(/)

...