想做一个md5查询的密码库
例如123的md5值是202cb962ac59075b964b07152d234b70
我们想实现用户输入该md5值能查询得出123这个明文值
存储内容就这么简单,但是由于数量是几万亿甚至十几万亿为级别的
存储占用的空间和查询速度就成了问题。
尝试过mysql,占用的空间有些大。
目标是一万亿条使用10T硬盘以下,有没有什么好的思路?
首先MD5是会碰撞的。如果你尝试将16个BYTE连起来作为整个空间的索引(2^128位空间索引,不过很恐怖。1T才2^40),就是现实的话,也未必你能到你的要求。因为确实存在,两个明文不一样,却有相同MD5的情况。
其次,如果你能确定是对密码处理。而且知道密码的长度上限,比如不超过16个字符。那么密码正常情况下,是键盘的可输入ascii值。例如,密码不是出现一个字符等于 0 ,或者 0x9。实际上,也就是大小写,几个标点,加0到9。由此,你的全遍历方式就少了。余下的事情是,将这些所有组合方式,你自己琢磨有多少可能吧。假设就是 26个字母输入,8个密码以内的长度,那么你最多只要 27^8就搞定。如果密码长度为4个。你可以默认前插4个char 为0 的字符。27^8是小于 2^5^8 = 2^40的。由此,你的T级存储还有的机会。
你要做的事情就是把可能的MD5值,按照大小排序,存储起来。每个记录里,包含MD5值和对应明文。
你可以多硬盘多服务器的存储。通过MD5的前面字节的情况,选择具体的服务器查询。相当于多极索引的方式。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。