我有一个包含数千行加密数据的SQL服务器数据库,但并非所有列都经过加密。我还有一个excel导出器,当激活时,遍历每一行,检查该行的每一列,看它是否是加密的cols之一,如果是,则解密它然后继续。
问题在于,这涉及到嵌套的foreach和检查系统,这种系统非常慢,并且随着DB变大而变得更糟。
这是代码部分的示例,它非常慢,在下面的代码中,“encryptedColumns”是List<>字符串,加密的列名称。
这显然效率低下,但有人可以建议快速修复以加快速度吗?
foreach (DataRow dr in dtData.Rows)
{
foreach (DataColumn c in dtData.Columns)
{
if (encryptedColumns.Contains(c.ColumnName.ToLower()))
{
if (!String.IsNullOrEmpty(dRow[c].ToString()))
{
string decryptedTitle = Encryption.DecryptStringAES( dRow[c].ToString(), 'AESKEY goes here');
dRow[c] = decryptedTitle;
}
}
}
}
更详细一点。以上是动态创建excel文档,我遍历所有行,当我到达需要解密的列时,我解密它,依此类推。
示例行可能是,您可以在纯文本内容中看到明显加密的内容。
乔| Bloggs | “£D£”$ |蓝色| “£$%^ FG£$ DF” £$
答案 0 :(得分:1)
我会迭代,而不是遍历每一行并检查每一列(O(n x m)
最佳时间复杂度,因为您总是检查n
行和m
列)通过列,找到需要解密的那些并解密这些值。
第一列方法的平均时间复杂度为O(Const x n) ~ O(n)
,其中Const
是需要解密的列数,n
是行数。也就是说,您只需要迭代需要解密的列,而不检查任何其他行/列。
我还使用搜索和分页 - 显示表格的一部分并允许用户来回走动。没有人能理解一个用户投掷数百万行的表,但如果你出现,一次说100行,允许分页并搜索未解密的数据,这将解决性能和可用性问题。
您可以尝试的另一件事是同时运行解密,如果您不修改数据,因此无需锁定,您现在可以运行多个线程来解密数据集的不同部分。