【发布时间】:2018-12-10 20:30:59
【问题描述】:
我在 txt 文件中有一个包含 15000000 个用户名的列表,我编写了一个方法来创建大脑钱包,检查是否有任何地址包含 600 个地址的列表。差不多就是这样
private static List<string> userList = new List<string>(File.ReadAllLines(@"C:\Users\Erik\Desktop\InfernoUser-workspace-db.txt"));
private static List<string> enterpriseUserList = new List<string>(File.ReadAllLines(@"C:\Users\Erik\Desktop\InfernoEnterpriseUser-local-db.txt"));
foreach (var i in userList)
{
userid = ToAddress(i);
if (enterpriseUserList.Contains(userid))
Console.WriteLine(i,userid);
{
private string ToAddress(string username)
{
string bitcoinAddress = BitcoinAddress.GetBitcoinAdressEncodedStringFromPublicKey(new PrivateKey(Globals.ProdDumpKeyVersion, new SHA256Managed().ComputeHash(UTF8Encoding.UTF8.GetBytes(username), 0, UTF8Encoding.UTF8.GetBytes(username).Length), false).PublicKey);
}
ToAddrsess 方法将用户名哈希为 SHA256 字符串,获取其公钥并将其转换为如下地址:
15hDBtLpQfcbrrAFupWjgN5ieHeEBd8mbu
这段代码很糟糕,运行速度很慢,每秒处理大约 200 行数据。所以我尝试使用多线程来改进它
private static void CheckAddress(string username)
{
var userid = ToAddress(username);
if (enterpriseUserList.Contains(userid))
{
Console.WriteLine(i,userid);
}
}
private static void Parallel()
{
List<string> items = new List<string>(File.ReadLines(@"C:\Users\Erik\Desktop\InfernoUser-workspace-db.txt"));
ParallelOptions check = new ParallelOptions() { MaxDegreeOfParallelism = 100 };
Parallel.ForEach<string>(items, check, line =>
{
CheckAddress(line);
});
}
这并没有太大帮助。有人可以建议如何即兴创作吗?与在 CPU 上运行的 vanitygen 相比,它每秒可以处理 4-500k 个地址。怎么会有这么大的区别?
【问题讨论】:
-
Contains进行线性搜索,您的算法基本上运行在 O(N×M) 中,如果它可以使用某种索引会快很多。 -
@Bart Friederichs 你能说得更具体点吗?
-
您可以解码企业列表中的 600 并进行比较,而不是对用户列表中的 1500 万进行编码吗?
-
@Jimmy 这不是 SHA256 的工作方式,您不能保留它。我从userList中随机选择了600个用户名,转换成地址做企业列表
-
好的,错过了 sha256 部分
标签: c# multithreading performance cryptography text-files