c# - 从特定索引启动单词生成器

标签 c# algorithm math combinatorics

我有一个密码列表生成器,它生成特定长度的一组特定字符的所有组合。 列表自然很长,生成需要相当长的时间。

我想并行处理该过程,但遇到了算法/数学问题。

例如,我想为 4 个字符长的密码生成 [a-z](26 个字母)的所有组合。 组合的总数是 26^4 = 456.976

并行化为 ex。两个进程,我想要一个进程处理前半部分,另一个处理后半部分。每个 228.488 个组合。

现在问题... 应该处理后半部分的过程,我从数字 228.488 到生成器应该开始的字母组合很热?

我正在寻找一个通用的解决方案,这样即使字母数或密码长度发生变化,它仍然可以工作。 当然这个早就解决了,说不定还有名字呢。我只是不知道这个名字,也无法用谷歌搜索它。

我正在用 C# 实现它

谢谢。

最佳答案

您正在探索整个 [a-z]^4 空间。该空间中有 26^4 个不同的元素。

只需将 [a-z]^4 的一个元素视为以 26 为基数的 4 位数字。给定一个整数 i,您可以在 base 26 中找到它的表达式并获得您要查找的 word

word[0] = i % 26
word[1] = (i / 26) % 26
word[2] = (i / 26 / 26) % 26
word[3] = (i / 26 / 26 / 26) % 26

如果您有 M 台机器,则索引 j 处的机器可以从索引开始:j*(26^4/M)

因此,如果您的机器从索引开始:228488,它将以单词开头:

word[0] = 228488 % 26             = 0  => 'a'
word[1] = (228488 / 26) % 26      = 0  => 'a'
word[2] = (228488 / 26 / 26) % 26 = 0  => 'a'
word[3] = (228488 / 26 / 26 / 26) = 13 => 'm'

关于c# - 从特定索引启动单词生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36564700/

相关文章:

c# - 错误 : Visual Studio 2022 "The build must be stopped before the solution can be closed." Disable Bullid option after build

c# - 从 .NET 4.0 方法写入控制台

algorithm - 数学归纳法,如何证明这个递归函数有效

algorithm - 在什么情况下,[0,1) 上生成的随机数与 [0,1] 上生成的随机数之间的差异会产生影响?

c# - 如何在 Windows 应用商店应用程序中与 SQL 交互

c# - 如何从 LINQ 中的列列表中选择非空值

performance - MergeSort 中的两个递归调用是什么?

ios - 计算一半的百分比

algorithm - 在仙境中数数

c# - 如何找到直线与二维椭圆相交的点 (C#)