首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从O(1)空间和时间中的随机访问查找密钥确定地生成随机查找数

从O(1)空间和时间中的随机访问查找密钥确定地生成随机查找数
EN

Stack Overflow用户
提问于 2018-06-10 05:17:37
回答 2查看 71关注 0票数 0

我想输出基于输入的随机看起来的数字。如果输入相同的内容,则会给出相同的输出。

我不想预先生成和存储一堆随机数据,也不想花费O(n)时间来恢复第n个索引。

它不需要是安全的、加密的或其他的,只要看起来是随机的即可。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-10 05:47:52

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

这与实际的数组表现不同,因为读取索引1(长度为10)和索引5(长度为10)不会有任何重叠(这是您在数组中所期望的)。

这会很慢,而且对N>512来说非常不方便,所以如果你需要更长的字符串,你会想要做多轮。像SHA3-512(SHA3-512(index)0:256)++SHA3-512(SHA3-512(index)256:512)这样的代码来获取1024字节长的内容。

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

我应该指出,这肯定是不安全的,并且输出很容易被对手预测到。

票数 1
EN

Stack Overflow用户

发布于 2018-06-10 05:52:32

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

代码语言:javascript
复制
random.seed(1)
for i in range(1, 10):
    print(random.randint(1,100)

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

代码语言:javascript
复制
random.seed(42)
for i in range(1, 10):
    print(random.randint(1,100)

如果您随后以某种方式将数组的各个部分描述为种子(您确实可以使用哈希函数来实现此目的),则可以使用该值作为生成器的种子,并可靠地允许动态调整请求列表的大小。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50778628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档