【问题标题】:How To Make This For Loop Faster如何使这个 for 循环更快
【发布时间】:2015-12-13 03:14:46
【问题描述】:

我的问题是这个 for 循环需要很长时间才能完成。 我想要一个更快的方法来完成它。

ArrayList arrayList = new ArrayList();
byte[] encryptedBytes = null;
for (int i = 0; i < iterations; i++)
{
    encryptedBytes = Convert.FromBase64String(inputString.Substring(base64BlockSize * i,
                     base64BlockSize));
    arrayList.AddRange(rsaCryptoServiceProvider.Decrypt(encryptedBytes, true));
}

iterations 变量有时会大于 100,000,而且会一直如此。

【问题讨论】:

  • RSA(非对称)加密比对称(例如:AES)加密慢得多,使用对称加密数据,非对称加密对称密钥。
  • 这不是办法。而是创建一个对称密钥,使用对称算法加密数据,如果需要,使用 RSA 加密对称密钥。这基本上就是 https 的工作原理。如果您不需要非对称加密(公钥/私钥对),请不要使用它。
  • 解密应该很慢,否则容易受到基于时间的攻击。
  • 找一个更好的导师,导师不应该教没有在实践中使用的方法。
  • @MohemmadAlBughdadi 如果您不愿意接受建议,为什么要问这个问题?在不改变其内部逻辑的情况下,真的没有其他方法可以加速 for 循环。

标签: c# performance for-loop encryption


【解决方案1】:

您是否考虑过在并行循环中运行解密过程。您的输入字符串必须首先在常规循环中准备好,但这是一个快速的过程。然后你在Parallel.For运行解密:

var inputs = new List<string>();
var result = new string[(inputString.Length / 64) - 1];

// Create inputs from the input string.
for (int i = 0; i < iterations; ++i)
{
    inputs.Add(inputString.Substring(base64BlockSize * i, base64BlockSize));
}

Parallel.For(0, iterations, i =>
{
    var encryptedBytes = Convert.FromBase64String(inputs[i]);
    result[i] = rsaCryptoServiceProvider.Decrypt(encryptedBytes, true);
});

我假设返回的结果是一个字符串,但如果不是这种情况,那么您必须调整并发包集合的类型。

【讨论】:

  • 如果结果没有按顺序返回,那么该代码肯定会中断。 ConcurrentBags 不也是无序的吗?
  • 公平点。它是无序的。可能依赖于 ConcurrentDictionary 并将整数用作键的版本是更好的选择。让我更新我的代码。
  • 我认为没有所有并发开销的常规字符串数组也可以正常工作。 var result = new string[iterations];
  • 经过测试,它工作正常,所以我用字符串数组更新了它。感谢您的建议。
猜你喜欢
  • 2019-07-25
  • 2020-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-29
  • 1970-01-01
  • 2014-08-20
  • 1970-01-01
相关资源
最近更新 更多