在O(1)空间和时间中从随机访问查找键确定性地生成随机查找数字

时间:2018-06-09 21:17:37

标签: random

我想根据输入输出随机数字。如果输入相同的输入,则给出相同的输出。

我不想预先生成并存储大量随机数据,我也不希望它花费O(n)的时间来恢复第n个索引。

需要安全,加密或其他方式,只需要随机看。

2 个答案:

答案 0 :(得分:1)

如果您想要从(索引,长度)对到随机查找字节字符串的确定性随机访问函数,您可以使用SHA3-N(index)[:length],其中N是第一个大于长度的方便数字。

这与实际数组的行为不同,因为读取索引1(长度为10)和5(长度为10)不会有任何重叠(您希望从数组中得到)。

对于N> 512来说这将是缓慢且非常不方便的,所以如果你需要更长的字符串,你将要做多轮。像SHA3-512(SHA3-512(索引)[0:256])++ SHA3-512(SHA3-512(索引)[256:512])得到的东西长达1024字节。

使用多轮部分你可以使用任何哈希函数(例如SHA256,MD5),这可能更方便。

我应该注意,这绝对不安全,并且对手很容易预测输出。

答案 1 :(得分:0)

通常,随机数生成器generate the same sequence of pseudo-random numbers given the same seed。例如,这样的python代码可能是这样的:

random.seed(1)
for i in range(1, 10):
    print(random.randint(1,100)

无论您调用该代码多少次,都会打印相同的列表。同样,这也是:

random.seed(42)
for i in range(1, 10):
    print(random.randint(1,100)

如果你以某种方式将数组的各个部分描述为种子(你可以使用哈希函数来实现这一点),你可以使用该值为生成器设定种子,并可靠地允许动态调整所请求列表的大小。