为什么在达到所有可能的组合之前我会出现堆栈溢出?

Why do I get stack overflow BEFORE all the possible combinations have been reached?

所以。 我正在用 Visual Basic 制作一个暴力破解器。 它有一个字符集,如下所示:

Dim charset as string
charset = "abcdefghijklmnopqrstuvwxyz1234567890."

有37个不同的字符吧?该程序用于搜索使用此字符集进行的所有不同组合,最多 3 个不同的字母。例如

这是可以组成的组合:ac6

因为有 37 个字母和 3 个槽位,所以可能的组合是 37^3

但我希望我的程序不要两次尝试相同的组合。

因此它会保存在此位置(桌面)尝试过的每个组合

Dim filex As System.IO.StreamWriter
            filex = My.Computer.FileSystem.OpenTextFileWriter("c:\Users\" + Environment.UserName + "\desktop\alreadytested.txt", True)
            filex.WriteLine(combination)
            filex.Close()

并且,在检查新组合的 Sub 的开头,我有这个

text = File.ReadAllText("c:\Users\" + Environment.UserName + "\desktop\alreadytested.txt")
index = text.IndexOf(combination) 'checks if it has been generated already
   If index >= 0 Then
       keyword() 'The sub
   End If

但是经过一些组合(在这种情况下,最大 37^3 ~= 50.000,我的程序尝试了大约 5200 次)我得到这个错误

'System.WhosebugException' 类型的未处理异常发生在 mscorlib.dll

而这个错误点在这行代码

filex = My.Computer.FileSystem.OpenTextFileWriter("c:\Users\" + Environment.UserName + "\desktop\alreadytested.txt", True)

但是为什么呢?在 5200 时仍有 44800 种可能的随机组合,为什么我会溢出?

如果我在 50000 种可能的测试中有 50000 种组合时得到它会有意义,但现在我只有 10%,那为什么我会溢出?

你继续递归调用 keyword() 方法。每次调用方法时,它的 return 地址和可能的参数 is/are 都会添加到调用堆栈中。调用堆栈在溢出之前只能接受一定数量的调用,对于您的计算机和您的特定方法,该数量似乎约为 5200。

你应该改为使用 While 循环,每当你想阻止其余的执行并返回到循环的开头时,你只需调用 Continue While.


还有一点要注意的是,您不应该在每次 read/write 时都打开和关闭文件。将文件的内容存储在一个长字符串中(或者更好,在 HashSet(Of T) 中)并在每次需要时检查,然后在循环结束时您可以将所有内容写入文件。

如果在此过程中您仍希望写入文件,请执行此操作。但是在你的循环之前打开一个流,你一直写入直到循环完成,然后关闭流。