- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
内容:
我试图将大量单独的密码列表文本文件合并为一个文件,以用于基于字典的密码破解。
每个文本文件都有行分隔符(每行一个密码),目前有82个单独的文件。大多数(66)文件的文件大小在1-100Mb范围内,其中12个文件在100-700Mb之间,3个文件在2Gb内,而1个(问题最多的)文件在11.2Gb内。
我估计总共需要处理17.5亿个非唯一密码。我估计其中约有4.5亿(%25)是重复项,最终需要丢弃。
我正在尝试在具有6GB以上可用RAM的设备上进行此操作(即8Gb已消耗2Gb)。
问题:
我需要一种方法来将a)所有这些密码汇总在一起,并b)在我的RAM内存限制内并在合理的时间内(〜7天,理想的要少得多)删除确切的重复项,但实际上我不在乎是否需要花费数周的时间,然后我再也不需要运行它了)时间窗口。
我是一名称职的Python程序员,因此已经多次破解。我最成功的尝试是使用sqlite3在磁盘进行过程中将已处理的密码存储在硬盘上。但是,这意味着通过散列每个完成的文件并在每次打开新文件时都进行维护/比较来单调乏味地跟踪各个处理实例之间已经完成了哪些文件(我取消并重新启动了几次以进行更改)。但是,对于非常大的文件,任何进度都将丢失。
我一次以大约10亿(最多)行的块为单位处理文本文件,以防止内存耗尽而长时间没有反馈。我知道我可以这样做,因为在24小时的运行时间中,数据库文件大小达到约4.5Gb时,我需要花很多时间来完全填充数据库,因此我估计剩下的时间最多要花4天才能完成所有工作,但是我不知道是否/如何最有效地对其进行读/写操作,也不知道如何解决删除重复项的任何好主意(在我填充数据库时还是做完之后做更多的遍……?在我不知道的数据库配置中,有没有一种更快的方法来查找唯一性?)。
我今天的要求是寻求有关编程和优化方法的建议/解决方案,以实现我庞大而独特的密码列表(理想情况下是使用Python)。如果我已经偏离标准,我完全愿意采取完全不同的方针。
有两个不错的选择:
一种在将来无需重新构建整个列表的情况下添加更多密码的方法;和
在所有这些操作的最后,数据库<20Gb,因此移动起来不是一个很大的麻烦。
解
基于CL的解决方案,该解决方案最终比我想的要优雅得多,因此我想出了一个稍微修改的方法。
按照CL的建议,我设置了一个sqlite3数据库,并将文本文件输入到Python脚本中,该脚本使用了它们,然后输出命令以将其插入数据库中。这项工作虽然直接进行,但是非常缓慢(不可行)。
我通过一些简单的数据库优化解决了这一问题,这些优化更容易实现,并且坦率地说更干净,可以从下面包含的基于CL框架代码的核心Python脚本中进行所有操作。原始代码产生了很多I / O操作,这一事实在我的(Win7)操作系统上引起了奇怪的事情,从而导致BSOD和数据丢失。我通过使整个密码文件的插入成为一个SQL事务加上几个编译指示更改来解决了这一问题。最终,该代码以大约30,000次插入/秒的速度运行,这不是最好的,但对于我的目的而言当然可以接受。
可能情况是,这仍然会在最大的文件上失败,但是如果/在这种情况下,我将简单地将文件分割成较小的1Gb部分并单独使用它们。
import sys
import apsw
i = 0
con = apsw.Connection("passwords_test.db")
cur = con.cursor()
cur.execute("CREATE TABLE IF NOT EXISTS Passwords(password TEXT PRIMARY KEY) WITHOUT ROWID;")
cur.execute("PRAGMA journal_mode = MEMORY;")
cur.execute("PRAGMA synchronous = OFF;")
cur.execute("BEGIN TRANSACTION")
for line in sys.stdin:
escaped = line.rstrip().replace("'", "''")
cur.execute("INSERT OR IGNORE INTO Passwords VALUES(?);", (escaped,))
i += 1
if i % 100000 == 0: # Simple line counter to show how far through a file we are
print i
cur.execute("COMMIT")
con.close(True)
insert_passwords.py < passwordfile1.txt
for %%f in (*.txt) do (
insert_passwords.py < %%f
)
最佳答案
将密码存储在SQL数据库中时,能够检测重复项需要索引。
这意味着密码在表和索引中存储两次。
但是,SQLite 3.8.2或更高版本支持WITHOUT ROWID tables(在其他数据库中称为“集群索引”或“索引组织表”),这避免了为主键使用单独的索引。
没有Python版本已包含SQLite 3.8.2。
如果不使用APSW,则仍可以使用Python创建SQL命令:
安装最新的sqlite3
命令行外壳程序(download page)。
创建数据库表:
$ sqlite3 passwords.db
SQLite version 3.8.5 2014-06-02 21:00:34
Enter ".help" for usage hints.
sqlite> CREATE TABLE MyTable(password TEXT PRIMARY KEY) WITHOUT ROWID;
sqlite> .exit
import sys
print "BEGIN;"
for line in sys.stdin:
escaped = line.rstrip().replace("'", "''")
print "INSERT OR IGNORE INTO MyTable VALUES('%s');" % escaped
print "COMMIT;"
$ python insert_passwords.py < passwords.txt | sqlite3 passwords.db
关于python - 从大型(密码)列表中聚合和删除重复项的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24053900/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!