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