提高sevenzipsharp 检查密码的速度(1)
前言: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>换成整型
提高sevenzipsharp 检查密码的速度(1)的更多相关文章
- 处理sevenzipsharp 检查密码函数的Bug
using (SevenZipExtractor extr = new SevenZipExtractor(tbPackagePath.Text, "www.pc6.com")) ...
- 通过预编译头文件来提高C++ Builder的编译速度
C++ Builder是最快的C++编译器之一,从编译速度来说也可以说是最快的win32C++编译器了.除了速度之外,C++builder的性能也在其它C++编译器的之上,但许多Delphi程序员仍受 ...
- AD帐户操作C#示例代码(二)——检查密码将过期的用户
本文接着和大家分享AD帐户操作,这次开发一个简单的检查密码将过期用户的小工具. 首先,新建一个用户实体类,属性是我们要取的用户信息. public class UserInfo { /// <s ...
- 检查密码复杂度的C#正则表达式
在用户注册与修改.重置密码时,强制密码达到一定的复杂度,是减少盗号的有效措施之一. 而在代码中检查密码复杂度就需要用到正则表达式,比如要求密码必须包含数字.小写或大写字母.特殊字符.字符数在8-30之 ...
- 如何提高Lucene构建索引的速度
如何提高Lucene构建索引的速度 hans(汉斯) 2013-01-27 10:12 对于Lucene>=2.3:IndexWriter可以自行根据内存使用来释放缓存.调用writer.set ...
- 提高NetBeans的代码提示速度.md
NetBeans配置 如何提高NetBeans的代码提示速度,打开下面的文件然后配置 **C:\Users\ylg\AppData\Roaming\NetBeans\8.2\config\Editor ...
- PAT 1081 检查密码(15) (代码+思路)
1081 检查密码(15 分) 本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能.该网站要求用户设置的密码必须由不少于6个字符组成,并且只能有英文字母.数字和小数点 .,还必须既有字母也 ...
- nginx提高加载静态文件速度
1.本来对于静态网页,我们不需要放在应用容器中,原因一时由于应用服务器是用来解析动态网页的,针对静态网页本来就性能不高,而且还会占用应用容器的资源,所以我们专门使用nginx用来解析静态网页. ...
- B1081 检查密码 (15分)
B1081 检查密码 (15分) 本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能.该网站要求用户设置的密码必须由不少于6个字符组成,并且只能有英文字母.数字和小数点 .,还必须既有字母 ...
随机推荐
- nyoj 142, poj 1039 ,hdu 1454 管道问题
http://acm.nyist.net/JudgeOnline/problem.php?pid=142 第一道解析几何问题,比较纠结,主要是几个解析几何的基本操作,包括求两线段的叉积,判断左右方向, ...
- SQL Server Reporting Services本机模式下的权限管理
SQL Server Reporting Services在安装配置后,缺省只给BUILTIN\Administrators用户组(实际上只有本机的Administrator用户)提供管理权限.所以所 ...
- mac 设置 git 和github 告别命令行
针对和我一样的新手,大虾们请轻拍. 很多小伙伴都想用git管理自己的代码,或者想在github上上传自己的项目.在网上找了几篇这方面的文章,都是用命令行设置的. 用命令行管理和安装太坑爹,这里有一个简 ...
- Struts2基础使用教程:OGNL
取自<JAVAWEB整合开发王者归来> 是一种类似EL的语言,比EL强大的多 能访问对象的方法,例如list.size() 能访问静态属性与静态方法,方法是在类名前.方法前加上@.如@ja ...
- 如何成功运行一个最简单的servlet
好吧,又是一个简单到不能再简单的问题~~ 由于各种原因,这次就不上图了,直接步骤和代码了. 1.前期准备 jdk.tomcat.EditPlus(eclipse)安装成功并且设置好环境变量. 2.由于 ...
- Windows MFC 两个OpenGL窗口显示与线程RC问题
问题为:背景界面是一个OpenGL窗口(对话框),在其上弹出一个OpenGL窗口(模态对话框)时, 1.上方的OpenGL窗口能响应鼠标操作等并刷新: 2.当移动或放大缩小上方的OpenGL窗口时,其 ...
- 对于大批量赋值功能,使用if判断是否能提高性能
场景: 如果对某变量进行赋值,是否需要判断一下,如果相等就不用赋值,这样会不会提高性能. 代码如下: "; "; , x2=, x3=; Stopwatch w = new Sto ...
- js复选框操作
$(".checkall").click(function () { if (this.checked) { $ ...
- 谈谈Java面向对象的三大特性
Java面向对象的三大特性就是指封装.继承.多态了. 一.封装: 概念:封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式. (举例:笔记本电脑就是一个封装体,Java语言中最小的封装体就是函数 ...
- hibernate中的cascade和inverse
以Student和class为例,一个Student对应一个class,一个class对应多个Student. Student.hbm.xml <?xml version="1.0&q ...