35行代码实现千万级别字典的快速去重
时间:2022-05-06
本文章向大家介绍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()
- CSS再学
- 动态规划
- 如何使用MVP+Dagger2+RxJava+Retrofit开发(1)
- 蓝牙门禁Android客户端
- Java直接(堆外)内存使用详解
- Html再学
- com.android.ddmlib.InstallException: Unable to upload some APKs?
- GET/POST/g和钩子函数(hook)
- cookie和session
- Python Flask模块
- Java直接内存与非直接内存性能测试
- Elasticsearch——multi termvectors的用法
- Elasticsearch增删改查 之 —— Delete删除
- Elasticsearch增删改查 之 —— Get查询
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 轻松构建Tomcat源码
- Flutter中Contrainer 组件的宽高限制分析
- 10张图带你深入理解Docker容器和镜像
- 手摸手教你撸一个微服务框架-关于服务端的处理
- 聊聊claudb的string command
- windows下安装nodejs
- 【Java面试总结】Java集合
- 《JavaScript 模式》读书笔记(8)— DOM和浏览器模式1
- 《JavaScript 模式》读书笔记(8)— DOM和浏览器模式2
- 5000字 | 24张图带你彻底理解21种并发锁
- JavaScript-变量
- Android应用安装卸载监控
- 细数这些年被困扰过的 TS 问题
- 将WordPress插件Elementor标签插入到WordPress模板文件以使用Elementor编辑
- WordPress自定义新建多区域widget小工具调用