- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个长文本文件,其中包含大约 1 亿个 MD5 哈希值。我想对一小组文件进行哈希处理,并找出其中任何一个文件的哈希值是否在 1 亿个哈希列表中。我的 1 亿个哈希是按字母顺序排序的。无需将整个列表加载到内存或数据库中,从这个大文本文件中查找哈希值的最有效方法是什么?哈希列表会不时更新,但会保持按字母顺序排序。对找到的命中位置不感兴趣。重要的是是否有命中。
最佳答案
这种作业的关键参数是单个磁盘查找的成本。磁盘查找具有固有的延迟,因为读/写磁头必须移动到正确的位置。在一个典型的磁盘上,每秒可以进行大约一百次查找。另一方面,磁盘非常擅长顺序读取,因此对于每次查找,您可以读取值(value) 1 兆字节的数据,而几乎没有额外的成本。
我在这里假设“文本文件”具有常规范式。例如,每个散列值正好使用 33 个字节,其中 32 个用于 MD5 结果本身(以十六进制表示)和 1 个额外字节用于“换行”字符。如果需要,根据确切的格式进行调整。使用这些数字,您的文本文件的长度约为 3.3 GB。
由于 MD5 的行为主要类似于随机函数,因此 1 亿个哈希值应均匀分布在 128 位值的空间中。这意味着,给定一个哈希值,您可以计算该值在文件中的大致位置(如果它在文件中)。例如,哈希值 9378ec093d09863d008154f1c8f5ca8f
应该在接近 0.5761*n*33 的偏移量处,其中 n 是大文件中的哈希数,“33”在上面的段落中进行了解释。 0.5761 是 0x9378EC 除以 0x1000000 的结果。因此,您可以读取以该计算位置为中心的一兆字节的文本文件。这将包含大约 30000 个哈希值。 1 亿个随机值的标准偏差约为 10000,因此 30000 个散列将包含正确值的可能性很高,以决定您的散列是否在列表中。如果估计值不正确,您将不得不再读取 1 兆字节,但这不会经常发生。可能,您可以读取多于 1 兆字节以减少这种情况的发生:有一个权衡,需要通过实际措施进行调整。
一旦您在 RAM 中有一个(小)哈希值块,请使用二进制搜索。但无论如何,最初的查找成本将使那部分完全相形见绌。
另一种解决方案使用额外的索引文件。构建一个二级文件,其中包含大文件中每 10000 个哈希值。该文件的长度约为 330 kB。尽可能将此文件保存在 RAM 中。使用它(通过二分搜索)来了解哪个 10000 个哈希序列与您的查找相关。然后从大文件中读取该块。每当哈希列表发生变化时,必须重建索引文件;这有点昂贵,但比实际的大文件更改要少。根据生成大文件的系统,您也许可以以可忽略不计的额外成本集成索引文件生成。
关于.net - 从 LONG 哈希列表中查找哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4254456/
我正在尝试 grep conf 文件中所有不以 开头的有效行 哈希(或) 任意数量的空格(0 个或多个)和一个散列 下面的正则表达式似乎不起作用。 grep ^[^[[:blank:]]*#] /op
我正在使用哈希通过 URL 发送 protected 电子邮件以激活帐户 Hash::make($data["email"]); 但是哈希结果是 %242y%2410%24xaiB/eO6knk8sL
我是 Perl 的新手,正在尝试从文本文件创建散列。我有一个代码外部的文本文件,旨在供其他人编辑。前提是他们应该熟悉 Perl 并且知道在哪里编辑。文本文件本质上包含几个散列的散列,具有正确的语法、缩
我一直在阅读 perl 文档,但我不太了解哈希。我正在尝试查找哈希键是否存在,如果存在,则比较其值。让我感到困惑的是,我的搜索结果表明您可以通过 if (exists $files{$key}) 找到
我遇到了数字对映射到其他数字对的问题。例如,(1,2)->(12,97)。有些对可能映射到多个其他对,所以我真正需要的是将一对映射到列表列表的能力,例如 (1,2)->((12,97),(4,1))。
我见过的所有 Mustache 文档和示例都展示了如何使用散列来填充模板。我有兴趣去另一个方向。 EG,如果我有这个: Hello {{name}} mustache 能否生成这个(伪代码): tag
我正在尝试使用此公式创建密码摘要以获取以下变量,但我的代码不匹配。不确定我做错了什么,但当我需要帮助时我会承认。希望有人在那里可以提供帮助。 文档中的公式:Base64(SHA1(NONCE + TI
我希望遍历我传递给定路径的这些数据结构(基本上是目录结构)。 目标是列出根/基本路径,然后列出所有子 path s 如果它们存在并且对于每个子 path存在,列出 file从那个子路径。 我知道这可能
我希望有一个包含对子函数的引用的散列,我可以在其中根据用户定义的变量调用这些函数,我将尝试给出我正在尝试做的事情的简化示例。 my %colors = ( vim => setup_vim()
我注意到,在使用 vim 将它们复制粘贴到文件中后尝试生成一些散列时,散列不是它应该的样子。打开和写出文件时相同。与 nano 的行为相同,所以一定有我遗漏的地方。 $ echo -n "foo"
数组和散列作为状态变量存在限制。从 Perl 5.10 开始,我们无法在列表上下文中初始化它们: 所以 state @array = qw(a b c); #Error! 为什么会这样?为什么这是不允
在端口 80 上使用 varnish 5.1 的多网站设置中,我不想缓存所有域。 这在 vcl_recv 中很容易完成。 if ( req.http.Host == "cache.this.domai
基本上,缓存破坏文件上的哈希不会更新。 class S3PipelineStorage(PipelineMixin, CachedFilesMixin, S3BotoStorage): pa
eclipse dart插件在“变量” View 中显示如下内容: 在“值”列中可见的“id”是什么意思? “id”是唯一的吗?在调试期间,如何确定两个实例是否相同?我是否需要在所有类中重写toStr
如何将Powershell中的命令行参数读入数组?就像是 myprogram -file file1 -file file2 -file file3 然后我有一个数组 [file1,file2,fil
我正尝试在 coldfusion 中为我们的安全支付网关创建哈希密码以接受交易。 很遗憾,支付网关拒绝接受我生成的哈希值。 表单发送交易的所有元素,并发送基于五个不同字段生成的哈希值。 在 PHP 中
例如,我有一个包含 5 个元素的哈希: my_hash = {a: 'qwe', b: 'zcx', c: 'dss', d: 'ccc', e: 'www' } 我的目标是每次循环哈希时都返回,但没
我在这里看到了令人作呕的类似问题,但没有一个能具体回答我自己的问题。 我正在尝试以编程方式创建哈希的哈希。我的问题代码如下: my %this_hash = (); if ($user_hash{$u
我正尝试在 coldfusion 中为我们的安全支付网关创建哈希密码以接受交易。 很遗憾,支付网关拒绝接受我生成的哈希值。 表单发送交易的所有元素,并发送基于五个不同字段生成的哈希值。 在 PHP 中
这个问题已经有答案了: Java - how to convert letters in a string to a number? (9 个回答) 已关闭 7 年前。 我需要一种简短的方法将字符串转
我是一名优秀的程序员,十分优秀!