针对已存储文件的数百万个哈希检查数百万个文件

 _名花侑主 发布于 2023-01-30 10:46

我有一个数百万sha256哈希文件的数据库.我经常收到数以百万计的新文件,我必须检查数据库以避免重复.

检查文件的哈希值与mysql数据库相比需要数年时间.我已经将哈希分成了16个表(0到F).我已经尝试过couchbase,但这需要超过8GB的内存并且导致数百万次哈希导致大量内存使用...

任何人都可以给我一个解决方案来存储大约4,5GB的哈希值(当哈希值被转储到纯文本文件时大小减小)在比MySQL更快的数据库中?

存储哈希没有任何元信息,没有文件名或路径或id或whatelse.

亲切的问候,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;

Dustin.. 6

您可能不需要数据库.

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

因此,您所要做的就是读取或mmap它,并对您检查的每个进行二进制搜索.

当sha1s的LinkedIn数据库泄露时,有一个站点尝试通过将所有哈希值放在数据库服务器中并让用户从Web请求中检查它们来尝试执行类似于此处的操作.

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

1 个回答
  • 您可能不需要数据库.

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

    因此,您所要做的就是读取或mmap它,并对您检查的每个进行二进制搜索.

    当sha1s的LinkedIn数据库泄露时,有一个站点尝试通过将所有哈希值放在数据库服务器中并让用户从Web请求中检查它们来尝试执行类似于此处的操作.

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

    2023-01-30 10:50 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有