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

欢迎!请查看关于页面以了解如何工作的更多信息。

0
ClojureScript

{{random-uuid}}当前使用{{Math/random}}通过{{rand-int}}生成用于v4 UUIDs的随机数。此补丁的目标是如果可用,改用加密强伪随机数生成器(PRNG)。

使用的函数是
{{window.crypto.getRandomValues}}在大多数浏览器中
{{window.msCrypto.getRandomValues}}在IE11中
* {{Math/random}}在不支持前者或Node.js上未提供加密模块的浏览器中

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

Google Closure似乎不提供对crypto-APIs的功能检测或包装,因此附加的补丁建议基于功能检测实现了一个模拟器。

一个悬而未决的问题是Node.js的角度如何使crypto模块可用,因为ClojureScripts的角度似乎没有条件{{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,该补丁删除了* }开关,并将{{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中条件性引入crypto库的建议。
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

添加了0007-CLJS-2386-fix-rand-array-len.patch,其中包含对{{random-uuid-vals}}中问题的修复,当{{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测试(/)

...