主要的技术难点是存储空间有限,所以主要解决的问题是如何尽可能的节省空间
首先必须自己设计一个存储架构
绝对不能用我们平常习惯用的MySQL数据库,因为这种数据库除了存储我们有效数据本身之外,还会存储其他的标记性数据,这些标志性的数据所占用的空间可能比你有效数据所占用的空间还要多
1.分类存储思想
进行分类存储之后有利于针对性的进行压缩。
例如:我们要实现能破解所有10位数字组合,这时我们的数字可以用整形进行存储,这时一个数字只占用34比特。如果动作字符串存储的话,就要80个比特了
分类方案建议:
6位大小写字母+数字+空格的所有组合(约有2的36次方种组合)
7位小写字母+数字的所有组合(约有2的36次方种组合)
8位小写字母+数字的所有组合(约有2的42次方种组合)
12位数字的所有组合(约有2的40次方种组合)
常用字典(这个很重要,自己去收集字典)
2.非完整性存储思想(时间换空间思想)
也就是说不需要存储完整的值。
例子1:我们存储明文aabbccdd的值的时候,我们可以不存储最后面1个字母。那问题来了,当我们需要读取这个明文的时候,如何获取它完整的值呢?其实我们可以通过暴力尝试。我们省略了一个字母,我们可以尝试轮流拼接这26个字母,然后再计算他的md5值,看看是否和原来的md5值匹配,这样一来我们最多需要尝试26次就能还原他完整的值。
例子2:不需要存储完整的MD5的值。 比如我们只存储MD5的前10位,我们查找的时候也是截取前10位再进行查找,等找到之后再验证明文md5的值是否有效
3.压缩存储思想
比如我们要存储大小写字母+数字的组合,即每一个字符有62种可能,这种情况下我们并不需要按原来的8个比特表示一个字符。而是用6个比特表示一个字符进行存储。当然,这种思想还需要结合分类存储思想
4.地址值化思想
也就是说,把存储地址当作md5的值,不需要存储md5的值,只需要存储明文。
例子1 :abcd的md5值是e2fc714c4727ee9395f324cd2e7f331f,这时候,我们可以截md5值的前8位作为这个明文在硬盘中的存储地址。然后把这个明文存储到这个地址当中。这样一来,我们就完全省略了md5值的存储空间