我有一个数百万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),它应该工作得很好.您可以使用文件扫描程序内联逻辑运行大致即时查找.
您可能不需要数据库.
sha256只有32个字节长.我生成了一个包含5000万个唯一sha256的列表,对它们进行排序,然后将它们放在一个文件中(不用十六进制编码).这是1.5GB的RAM,用于非常均衡的二进制排序结构.对于你能找到的任何计算机来说,这应该很容易.
因此,您所要做的就是读取或mmap它,并对您检查的每个进行二进制搜索.
当sha1s的LinkedIn数据库泄露时,有一个站点尝试通过将所有哈希值放在数据库服务器中并让用户从Web请求中检查它们来尝试执行类似于此处的操作.
它不能可靠地工作,所以我基本上构建了上面描述的内容.如果你在我的要点中获取代码:https: //gist.github.com/dustin/2885182并修改sha256(基本上将散列大小设置为32而不是20),它应该工作得很好.您可以使用文件扫描程序内联逻辑运行大致即时查找.