假设我有一个包含我数据的文本文件。
data :
ab
bc
de
-
encrypted data on text file :
ba
cb
ed
我想从文本文件中找到bc
,所以我必须使用以下代码解密文本文件:
SL:=TStringList.create;
SL.LoadFromFile(textfile)
SLtemp:=TStringList.create;
for I := 0 to SL.Count - 1 do
SLtemp.Add(ReverseString(SL[i])); //decrypt
SL.Free;
for I := 0 to SLtemp.Count - 1 do
if SLtemp[i] = 'bc' then
begin
showmessage('found');
break;
end;
SLtemp.Free;
我认为我的方式是浪费资源。我必须将整个文件加载到内存并解密它们。我需要一些建议来快速找到加密文本中的特定行。
感谢。
答案 0 :(得分:6)
听起来你正在尝试实现某种类型的数据库。 SQLite具有索引的透明加密支持。相信我,除非你把man- 年放进去,否则你的数据库会很糟糕。
要真正解决问题,您必须通过解密每一行并为其编制索引来构建(加密)索引。如果您在处理数据并考虑到性能时,您应该非常熟悉索引策略。
但首先要问问自己,数据是否足够大,甚至不重要?如果它在十分之一秒内运行,那么它在百分之一的运行是毫无意义的。如果花了一个星期的时间,这表明你无论如何都无法走上错误的轨道,小的优化也无济于事。
很抱歉,如果这有点苛刻,特别是来自实施了几个自制数据库的人。
答案 1 :(得分:2)
除非您故意将要搜索的每个元素的加密块分开(这是一个非常可行的选项),否则每次(平均)必须至少解密一半文件。
您可以逐行加密(就像我说的那样,完全可能),加密搜索文本,然后只需找到匹配的行。
否则,您必须解密文件并搜索解密过程的输出以搜索字符串。如果您可以在加密仍在进行时搜索输出,则可以在找到文本时提前停止解密。
我喜欢SilverbackNet的加密数据库创意,我同意你不应该自己推出。您可能还需要确保索引也是加密的,如果数据库没有为您处理该细节(它应该)
答案 2 :(得分:1)
如果您的加密过程是一次一行。为什么不将关键字“bc”加密为“cb”,然后查找它? (不解密整个文件)