3

有谁知道符合上述所有标准的算法?我需要指定一个种子编号,以及我希望输出编号所属的范围(这也将是输入编号所在的范围)。此函数还需要有一个反向操作的对应项。

例如:

我传递种子 5 和范围 5-35,然后我收到数字 27。然后我可以将它传递给一个反转操作的函数,使用相同的范围,这将使我返回数字 5。

我无法存储原始数字,也无法遍历输入数字列表。这不一定是加密强度,它必须尽可能快。

我能想到的唯一符合这种描述的是加密算法。即使是正确方向的一点也很棒。

编辑

我正在尝试找到一种方法来表示一组太大而无法保存在内存中的随机(看起来)数字(可能是 3e12 数字),然后测试该集合中是否出现某些数字范围。

例如。如果我有一个函数可以给我随机集合(4、22、7、343、67、38、2),我想说,给我该集合中介于 1 和 30 之间的数字,并且取回集合 (4, 22, 7, 2)。

4

2 回答 2

1

正如 RB 所说,您需要加密,而不是 RNG。使用给定的密钥,加密是可逆的。如果您想从具有更改范围的同一种子中获得不同的结果,则密钥也可以包含种子和范围。

范围大小是一个不同的问题。对于 32 位范围,使用 DES。对于 64 位使用 AES。对于其他范围,要么编写您自己的简单Feistel 密码,要么使用为所有大小定义的Hasty Pudding 密码。

无论您使用什么底层密码,您始终可以使用 Hasty Pudding 方法在适当的范围内找到一个数字:只需继续对输出进行加密,直到它在所需的范围内。一旦你有合适大小的东西,你可以添加下限来获得你需要的数字。因此,对于 5 到 35 的范围,您将在 [0..30] 中生成一个数字并添加 5。

ETA:在考虑了您的问题之后,您不能将种子用作密钥的一部分。如果你这样做,你将无法重建密钥来解密你的随机数。您只能在开始逆向过程时知道的密钥中使用数据。

当你接触到种子时,你还需要一种识别种子的方法。当你解密时,你会得到一系列数字;您需要一种方法来找出哪个是原始种子。也许您可以将种子限制在指定的范围内(或其从零开始的等效项),并在解密系列中选择第一个处于正确范围内的种子。

于 2013-03-14T16:41:51.833 回答
0

不,这是不可能的。随机数生成器可以从多个不同的种子生成相同的输出(在这方面,它就像一个散列算法从不同的输入生成相同的输出)。

例如,PRNG 可能像这样工作(伪代码):

PRNG randomWithSeed5 = new PRNG(seed: 5);
PRNG randomWithSeed6 = new PRNG(seed: 6);
PRNG randomWithSeed7 = new PRNG(seed: 7);

randomWithSeed5.NextInt(range: 5-50); //returns 20
randomWithSeed6.NextInt(range: 5-50); //returns 20
randomWithSeed7.NextInt(range: 5-50); //returns 32

在这一点上,很明显不可能编写一个解码算法,给定输入 20,可以返回正确的种子 - 你无法决定是否56将是正确的答案。

听起来加密算法会更好地满足您的需求 - 我什至不明白为什么涉及随机数生成器。

于 2013-03-14T15:44:20.910 回答