提高sevenzipsharp 检查密码的速度(1)
2024-10-18 21:24:39
前言:sevenzipsharp检查密码(包括检查压缩包的有效性)的函数是SevenZipExtractor.check(), sevenzipsharp调用的是7zip的动态链接库,而且不止是7zip,其它压缩软件测试密码这个功能耗时也很久(压缩包小可以忽略,密码错误的时候速度还行,密码正确的话,会把压缩包全部解压,耗时相当于解压一个文件的时间),除了360压缩比较快,至少快几百倍,但是找不到调用的方法,如果谁有更好的解决方案,麻烦提供一下。
原来的check方法4G大小的文件大概耗时
错误的密码:www.cr173.com用时:0.19秒
正确的密码:www.he11oworld.com用时:85.98秒
方案1:我的思路是既然检测一个压缩包的解压密码,没必要把所有的文件都检测一遍,取压缩包最小的加密文件去检测就行了,4G大小的文件大概耗时
错误的密码:www.cr173.com用时:0.19秒
正确的密码:www.he11oworld.com用时:26.18秒
方案2:同样是检查一个文件,检查第一个加密文件,,4G大小的文件大概耗时
错误的密码:www.cr173.com用时:0.12秒
正确的密码:www.he11oworld.com用时:0.10秒
发现方案二是最优的,一下是具体实现的代码
定义一个全局字段,用来存取压缩包内最小的文件索引和大小
private IDictionary<int, ulong> encryptionFileInfo = null;
初始化窗体时实例化
encryptionFileInfo = new Dictionary<int, ulong>();
获取压缩包信息时,保存最小文件的索引和大小
encryptionFileInfo.Clear();
foreach (ArchiveFileInfo item in extr.ArchiveFileData)
{
if (item.Encrypted)
{
if (encryptionFileInfo.Count == )
{
encryptionFileInfo.Add(item.Index, item.Size);
}
////只检测最小文件的实现方法
//else
//{
// if (encryptionFileInfo.Values.ElementAt(0) > item.Size)
// {
// encryptionFileInfo.Clear();
// encryptionFileInfo.Add(item.Index, item.Size);
// }
//}
}
}
实现优化函数,在SevenZipExtractor.cs单元添加函数如下函数
/// <summary>
/// 检查压缩包密码
/// </summary>
/// <param name="minFileIndex">压缩包中加密文件索引最小的值</param>
/// <returns></returns>
public bool Check(int minFileIndex)
{
DisposedCheck();
try
{
InitArchiveFileData(false);
var archiveStream = GetArchiveStream(true);
var openCallback = GetArchiveOpenCallback();
if (!OpenArchive(archiveStream, openCallback))
{
return false;
}
using (var aec = GetArchiveExtractCallback("", (int)_filesCount, null))
{
try
{
uint[] u = new uint[];
u[] = uint.Parse(minFileIndex.ToString());
CheckedExecute(
_archive.Extract(u, , , aec),
SevenZipExtractionFailedException.DEFAULT_MESSAGE, aec);
//CheckedExecute(
// _archive.Extract(null, UInt32.MaxValue, 1, aec),
// SevenZipExtractionFailedException.DEFAULT_MESSAGE, aec);
}
finally
{
FreeArchiveExtractCallback(aec);
}
}
}
catch (Exception)
{
return false;
}
finally
{
if (_archive != null)
{
_archive.Close();
}
((InStreamWrapper)_archiveStream).Dispose();
_archiveStream = null;
_opened = false;
}
return true;
}
之后就是调用了,
using (SevenZipExtractor extr = new SevenZipExtractor(tbPackagePath.Text, Convert.ToString(item["Password"])))
{ if (extr.Check(index))
{
tbPassword.Text = Convert.ToString(item["Password"]);
memoEdit1.Text = memoEdit1.Text + "此为正确密码:" + Convert.ToString(item["Password"]) + "用时:" + (DateTime.Now - dtStartDetail).TotalMilliseconds.ToString() + "\r\n";
return;
}
memoEdit1.Text = memoEdit1.Text + "测试密码:" + Convert.ToString(item["Password"]) + "用时:" + (DateTime.Now - dtStartDetail).TotalMilliseconds.ToString() + "\r\n";
}
如果只用方案2可以把IDictionary<int, ulong>换成整型
最新文章
- Sprint(第九天11.22)
- 《Hadoop基础教程》之初识Hadoop
- Oracle数据库五种约束
- Remoting
- 十个iOS面试问题
- Python学习【第十二篇】模块(2)
- 数据库习题(oracle)
- jQuery基础知识总结二
- Android 开发笔记___图像按钮__imageButton
- 学习rollup.js模块文件打包
- VBoxManage命令速记
- AE插件:能量激光描边光效特效Saber Mac汉化版
- NLP VS NLU
- Memcache之安装篇
- Bamboo基础概念
- C语言中的字符串处理库函数介绍与实现
- C# 图片 旋转和翻转 RotateFlip
- Linux/Mac 挂载远程服务器目录到本地
- 安装和使用solr
- Vue实现双向绑定的原理以及响应式数据