【问题标题】:Checking millions of files against millions of hashes for already stored files针对已存储文件的数百万个哈希值检查数百万个文件
【发布时间】:2014-02-24 02:03:55
【问题描述】:

我有一个包含几百万个 sha256 哈希文件的数据库。 我经常收到数百万个新文件,我必须对照数据库检查这些文件以避免重复。

根据 mysql 数据库检查文件的哈希值需要数年时间。我已经将散列分成 16 个表(0 到 F)。我已经尝试过 couchbase,但这需要超过 8GB 的​​ RAM,并且由于 RAM 使用量过多而留下了几百万个哈希值,因此中止了导入...

谁能给我一个解决方案,在比 MySQL 更快的数据库中存储大约 4.5GB 的哈希(将哈希转储到纯文本文件时计算的大小)?

哈希存储时没有任何元信息,没有文件名或路径或 id 或其他内容。

亲切的问候, 3vilc00kie

编辑表定义:

-- phpMyAdmin SQL Dump
-- version 3.3.9
-- http://www.phpmyadmin.net
--
-- Host: 127.0.0.1
-- Erstellungszeit: 31. Januar 2014 um 13:55
-- Server Version: 5.5.8
-- PHP-Version: 5.3.5

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Datenbank: `filehashes`
--

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `0`
--

CREATE TABLE IF NOT EXISTS `0` (
  `sha256` binary(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `1`
--

CREATE TABLE IF NOT EXISTS `1` (
  `sha256` binary(32) NOT NULL,
  UNIQUE KEY `sha256` (`sha256`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `2`
--

CREATE TABLE IF NOT EXISTS `2` (
  `sha256` binary(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `3`
--

CREATE TABLE IF NOT EXISTS `3` (
  `sha256` binary(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `4`
--

CREATE TABLE IF NOT EXISTS `4` (
  `sha256` binary(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `5`
--

CREATE TABLE IF NOT EXISTS `5` (
  `sha256` binary(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `6`
--

CREATE TABLE IF NOT EXISTS `6` (
  `sha256` binary(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `7`
--

CREATE TABLE IF NOT EXISTS `7` (
  `sha256` binary(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `8`
--

CREATE TABLE IF NOT EXISTS `8` (
  `sha256` binary(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `9`
--

CREATE TABLE IF NOT EXISTS `9` (
  `sha256` binary(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `a`
--

CREATE TABLE IF NOT EXISTS `a` (
  `sha256` binary(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `b`
--

CREATE TABLE IF NOT EXISTS `b` (
  `sha256` binary(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `c`
--

CREATE TABLE IF NOT EXISTS `c` (
  `sha256` binary(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `d`
--

CREATE TABLE IF NOT EXISTS `d` (
  `sha256` binary(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `e`
--

CREATE TABLE IF NOT EXISTS `e` (
  `sha256` binary(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `f`
--

CREATE TABLE IF NOT EXISTS `f` (
  `sha256` binary(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

【问题讨论】:

  • 拆分表可能会适得其反。如果您的表在散列值上正确索引,则检查散列不应花费“年”。发布您的表定义。
  • 这没有意义。如果您已经在数据库中索引了哈希列,那么检查一个只有几千万的表应该几乎是即时的。告诉我们更多,您执行什么样的查询,以及表的外观如何(包括索引)。 (在这种情况下需要时间实际上是计算文件内容的哈希)
  • 妈的,我只用了一次 UNIQUE ……对所有表都实现了会不会快很多?

标签: mysql database hash memcached bigdata


【解决方案1】:

你可以使用 MySQL:

【讨论】:

  • 我不明白添加密钥如何使其更快。
  • @EJP 因为 innodb 在主键上集群,而 sha256 在设计上与随机无法区分? stackoverflow.com/questions/9819271/…我小心地说它想要对这些数据进行基准测试
【解决方案2】:

我会使用 MySQL 分区,而不是处理多个表。您可以很容易地将数据与索引一起划分到多个表中。这简化了查询和维护。

但是,以下是重要的。在 mdx 哈希上创建一个索引——这不必是主键或唯一索引。如果你做的事情正确,那么索引将是唯一加载到内存中的东西。

其次,确保 MySQL 配置为使用大量内存。

如果索引适合内存,那么你就可以了。

您获取“数百万个新文件”的过程建议在比较方面进行优化。如果“文件”在应用程序中并且您正在逐一比较,则在进行比较之前对文件进行排序散列。按顺序遍历数据将对性能产生奇迹。

如果它们在数据库中,则将它们放在以哈希为主键的临时表中。这将使它们保持有序。然后索引查找将非常有效,即使索引没有完全适合内存。

【讨论】:

    【解决方案3】:

    我认为在你的情况下你应该使用 HBASERedis

    您可以使用 HBASE 或 Cassandra 来存储文件。

    由于文件大小和散列以 GB 为单位,使用 MySQL 不会是更好的选择。

    您可以使用 Redis 来存储文件的哈希值。

    我有机会使用 Redis,根据我的经验,我可以说 Redis 非常快。 这样做的原因是, REDIS 是一种内存数据存储。

    This 可能有助于了解更多关于 redis 的信息。

    所以,我认为你应该使用

    HBASE / CASSANDRA:数据存储

    REDIS : 用于存储哈希。

    希望这可能会有所帮助。 谢谢。

    【讨论】:

      【解决方案4】:

      您可能不需要数据库。

      sha256 只有 32 字节长。我生成了一个包含 5000 万个唯一 sha256 的列表,对它们进行排序,然后将它们放入一个文件中(没有对它们进行十六进制编码)。对于非常平衡的二进制排序结构,这是 1.5GB 的 RAM。对于您能找到的任何计算机来说,这应该很容易。

      因此,您所要做的就是读取或映射它,然后对您检查的每一个进行二进制搜索。

      当 sha1s 的 LinkedIn 数据库泄露时,有一个网站试图做一些类似于你在这里所做的事情,将所有的哈希值放在一个数据库服务器中,让用户从网络请求中检查它们。

      它不能可靠地工作,所以我基本上构建了我上面描述的内容。如果您在此处获取我的要点中的代码:https://gist.github.com/dustin/2885182 并针对 sha256 进行修改(基本上将散列大小设置为 32 而不是 20),它应该工作得很好。您可以在文件扫描器中运行内联逻辑,以实现近似即时的查找。

      【讨论】:

        【解决方案5】:

        只需在“sha256”字段上添加一个索引。事实上,正如 Dustin 所指出的,这只是 1.5 GB 的数据。如果这是您所熟悉的(并且您显然是),它将适合 MySQL 中的单个表。只是索引。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-06-02
          • 2016-08-22
          • 1970-01-01
          • 2012-04-14
          • 2021-07-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多