【发布时间】:2021-04-27 12:14:53
【问题描述】:
我在下面找到了this,用于 JavaScript 中的 8 位和 16 位数字:
const fetch = (x, o) => {
if (x >= o) {
return x
} else {
const v = (x * x) % o
return (x <= o / 2) ? v : o - v
}
}
const fetch16 = (x) => fetch(x, 65519)
const fetch8 = (x) => fetch(x, 251)
// the last number can be anything.
const build16 = (x, o) => fetch16((fetch16(x) + o) ^ 42703)
const build8 = (x, o) => fetch8((fetch8(x) + o) ^ 101)
let i = 0
let invalid = []
while (i < 255) {
let j = 0
while (j < 255) {
let x = build8(i, j)
if (x > 255) {
invalid.push([ i, j, x ])
}
j++
}
i++
}
console.log(JSON.stringify(invalid))
然而,虽然 fetch8 和 fetch16 函数可以正确在重复之前循环遍历整个数字集,但 build8 和 build16 函数不能,它们超出了所需的范围,请参阅上述代码的输出。比如i = 11和j = 184时,x = 340就是> 255。
但是,build8 和 build16 函数的输出非常棒。它看起来完全是随机的,并且在遍历整个集合之前不会重复任何值。
如何修改这些 build8 和 build16 函数,使它们只包含集合中的数字(0-255 或 0-65535),但又像这里一样显得完全随机,但从不重复在经历所有这些之前的价值?
我不完全确定帖子的作者是如何登陆fetch8((fetch8(x) + o) ^ 101) 的,例如,执行 XOR 并传递这样的值。但最终结果显得非常随机。我只是想这样做,所以输出是:
- 在所需的值范围内。
- 在枚举完所有值之前不重复任何值。
- 像 build8 一样完全随机。
【问题讨论】:
-
我发现
buildXX接受两个参数并且你改变它们两个参数,从而提供更多的组合可能性,如果可以产生结果,我会感到困惑。为什么这里有 2 个维度而不是 1 个维度? -
"我不完全确定帖子的作者是如何登陆
fetch8((fetch8(x) + o) ^ 101)的" - 你是说that post 的作者吗?我在该页面上找不到任何类似于build8的代码。
标签: javascript math random cryptography