35行代码实现千万级别字典的快速去重

字典对于一个安全从业者的意义非常重要,尤其是渗透测试工程师,一份好的字典往往能带来意外的收获。 在当前各种裤子满天飞的环境下,快速整理有用信息并加入自己的字典已成为安全从业者的一个必备技能。 在处理大量单一字典变量的时候,我们往往会发现大量的重复,无论是什么原因造成的,对于一个强迫症来说,这是不能忍受的。 在一次hash爆破中,被爆hash类型是bcrypt,此时字典的去重工作就尤为重要了,字典不去重会严重影响爆破效率。 于是使用自己几年前写的一个基于数组遍历的字典去重工具对约1500万的一份字典进行了去重,可结果吓我一跳,整整一天一夜居然还没完成。 于是就有了下面的脚本。 在大字典中,会有各种各样的问题,比如这份字典可能是几份字典合成的,有中文、俄文、英文等等,甚至在实际操作中我发现了二进制、不可见字符串、句子等等。 这样即便去重,也仍然会有大量的无用条目在里面继续影响效率。 现实中遇到的字典一般不会超过1个G,而计算机内存却远远大于这个数字,所以一下把字典加载到内存进行处理的方式是完全可行的。 经字典完全载入内存后,利用正则匹配(这里很灵活,可以根据需求实时更改)“抓”出所有符合条件的条目,再进行去重。 数据量很大的情况下,用数组遍历的方式是无法完成工作的,这时就需要用到“哈希表”这个概念。 熟悉python我们知道,python的set的元素具有唯一性,利用该性质便可轻易达到去重的目的,最关键的是,set在cpython解释器的实现用了hashtable,所以效率奇高。 下面是一个demo,去重1500万的一个字典,消耗时间大约10s左右。

#coding=utf-8
import sys, re, os
def getDictList(dict):
   regx = '''[\w\~`\!\@\#\$\%\^\&\*\(\)\_\-\+\=\[\]\{\}\:\;\,\.\/\<\>\?]+'''
   with open(dict) as f:
       data = f.read()
       return re.findall(regx, data)
def rmdp(dictList):
   return list(set(dictList))
def fileSave(dictRmdp, out):
   with open(out, 'a') as f:
       for line in dictRmdp:
           f.write(line + '\n')
def main():
   try:
       dict = sys.argv[1].strip()
       out = sys.argv[2].strip()
   except Exception, e:
       print 'error:', e
       me = os.path.basename(__file__)
       print 'usage: %s <input> <output>' %me
       print 'example: %s dict.txt dict_rmdp.txt' %me
       exit()
   dictList = getDictList(dict)
   dictRmdp = rmdp(dictList)
   fileSave(dictRmdp, out)
if __name__ == '__main__':
   main()

原文发布于微信公众号 - 中国白客联盟(China_Baiker)

原文发表时间:2015-09-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT派

Python学习路线图

Python上手很容易, 基本有其他语言编程经验的人可以在1周内学会Python最基本的内容.

4350
来自专栏take time, save time

初级程序员面试不靠谱指南(一)

    “来到这英雄宴中的人物,就算本身武功不是甚高,见识也必广博,“太祖拳法”的精要所在,可说无人不知。乔峰一招打出,人人都是情不自禁的喝了一声采!这满堂大采...

3559
来自专栏诸葛青云的专栏

利用c语言制作简易计算器

学了c语言之后,总想着能用c语言能制作一些简单的小工具来。而利用c语言来制作一款简易的计算器是一个不错的选择,用这款计算器可以计算的加、减、乘、除。

7221
来自专栏腾讯Bugly的专栏

iOS内存管理:从MRC到ARC实践

对于iOS程序员来说,内存管理是入门的必修课。引用计数、自动释放等概念,都是与C语言完全不同的。搞明白这些,代码才有可能不 crash。然而就是这么牛逼的内存管...

3665
来自专栏Java技术栈

面象对象设计6大原则之六:迪米特原则

迪米特原则(LOD),The Law Of Demeter,也称为最少知识原则 定义 一个对象应该对其他对象有最少的了解。 也就是说一个类耦合和调用一个类应该知...

3236
来自专栏web前端教室

这几天在看JS的数据结构与算法

这几天在看数据结构与算法,js描述这书 ? 这书看着标题挺高大上的,但内容不难, 只要有JS的基本知识,都能看明白。 它里面不讲JS本身如何,而是把各种数据结...

2248
来自专栏北京马哥教育

Python语言在数据挖掘上有很大优势,但它的缺点你知道吗?

Python语言的优势 基于以下三个原因,选择Python作为实现数据挖掘算法的编程语言: (1) Python的语法清晰; (2) 易于操作纯文本文件; (3...

3516
来自专栏Pythonista

面向对象的软件开发

很多人在学完了python的class机制之后,遇到一个生产中的问题,还是会懵逼,这其实太正常了,因为任何程序的开发都是先设计后编程,python的class机...

1222
来自专栏编程

Java语言零基础菜鸟入门Java程序学习的要点

一、掌握静态方法和属性 静态方法和属性用于描述某一类对象群体的特征,而不是单个对象的特征。Java中大量应用了静态方法和属性,这是一个通常的技巧。但是这种技巧在...

2130
来自专栏Pythonista

day24,python习题

有两个列表,分别存放来老男孩报名学习linux和python课程的学生名字 linux=['钢弹','小壁虎','小虎比','alex','wupeiqi'...

1592

扫码关注云+社区

领取腾讯云代金券