【问题标题】:How is the search on Library of Babel SO fast?巴别图书馆的搜索速度如何?
【发布时间】:2015-12-04 22:22:45
【问题描述】:

这是用户@David 对巴别图书馆的描述

巴别图书馆网站 (libraryofbabel.info) 包含书籍 带有伪随机生成的文本,每个有 410 页,位于 图书馆的“地板”、“墙壁”和“架子”。任何小于的序列 超过 3200 个字符(包括所有 26 个字母和句点、空格、 和逗号)至少可以在其中一本书中找到。

在网站上,您可以搜索一个字符串(最多 3200 个字符),网站会返回 3 个结果: 1)只有那一串文本,这是一个独特的页面 2)该字符串出现在随机字符中的任何位置 3) 无论该字符串出现在实际英语单词的随机组合中的什么地方

让我惊讶的是,搜索的速度有多快。据推测,该站点实际上并没有存储任何页面,它们都是通过算法生成的(如果我错了,请纠正我)。如果是这种情况,它如何几乎立即生成所有可能的组合,将它们分成随机字符和英文单词,并告诉我字符串显示在多少页中?即使有一些统计上的手忙脚乱,如果它告诉我有 78482018 个页面与我的查询匹配,这更像是一个估计,它仍然会立即返回 20 个页面。不认真。 对。离开。

怎么会这么快?

【问题讨论】:

  • 最有可能的是,他们使用的是弱 RNG,您可以在其中数学确定什么种子会产生给定的输出序列。但是,如果不查看来源,我们就无法判断。
  • 谢谢;什么是弱 RNG?
  • 啊,是的,对不起。我应该说什么是“弱RNG”。我搜索了谷歌,我能想到的最好的结果是它与加密和容易破译有关?
  • 弱到可以预见。给定一定数量的输出,你可以知道种子是什么以及未来的输出是什么。

标签: string search random search-engine


【解决方案1】:

注意:这是一个数学答案

babel 图书馆实际上并没有存储任何东西,也就是说存储了 29^3200 本书。

首先,我将首先解释什么是伪随机函数。一个好的伪随机函数会生成一个看似随机的数字序列,但只要有足够的信息就可以预测出来。

以函数为例

f(x) = x^2 + c mod n,其中 c 和 n 是常数

如果我们从 x=2、c=1 和 n=20 开始,通过重复将 f(x) 应用于先前的结果(迭代 f(x)),我们将得到序列

2、5、6、17、10、1、2……循环重新开始……

因此,如果我们知道 c、n 和 x 的起始值(称为种子),则可以轻松预测以下数字。例如,种子为 6,您可以预测后面的数字将是 17、10 和 1。如果您想记住序列 17、10、1,您只需记住种子 (17),以及序列的长度 (3)。

如果您要枚举由 Babel 库使用的函数生成的完整序列,直到它循环回第一个数字,您最终会得到一个包含所有可能的 3200 个字符子字符串的字符串。要查找子字符串,您只需要种子。

最后一个技巧是找到一个可逆的函数,这意味着给定一个[子]序列,可以找到种子。许多伪随机函数可以不费力地进行逆向工程,但在巴别图书馆的情况下,需要一些努力。

*几乎所有

【讨论】:

    猜你喜欢
    • 2016-02-05
    • 1970-01-01
    • 2012-06-07
    • 2014-04-28
    • 2014-10-10
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 2010-12-30
    相关资源
    最近更新 更多