gpt4 book ai didi

.net - 使用 SHA1CryptoServiceProvider 获取正在计算的 SHA1 的进度

转载 作者:行者123 更新时间:2023-11-30 03:06:32 28 4
gpt4 key购买 nike

目前,我正在我的 C++/CLI 代码中实现一个返回文件 SHA1 值的函数。它是 Visual Studio 中的 Windows 窗体应用程序。

我选择实现 .NetFramework 类 SHA1CryptoServiceProvider 因为它真的很快(相信我)。我测试了几种算法,但没有一种算法像 SHA1CryptoServiceProvider 类一样快。

问题是在我的应用程序中有一个 progressBar 显示计算 SHA1 的进度,而 SHA1CryptoServiceProvider 类没有任何返回计算 SHA1 进度的函数。

代码如下:

using namespace System::Security::Cryptography;
using namespace System::IO;

StreamReader^ Reader = gcnew StreamReader("C:\\abc.exe");
SHA1CryptoServiceProvider^ SHA1 = gcnew SHA1CryptoServiceProvider();

String^ Hash = "";

Hash = BitConverter::ToString(SHA1->ComputeHash(Reader->BaseStream));
return Hash;

最佳答案

我终于做到了。我发布代码,也许有人会发现它有用。我知道代码不干净,我还在学习。它可以计算大于 2^31 字节的文件的 SHA1。在 22GB 的文件上进行了测试。在 backgroundWorker 中工作正常:)

#define SHA1_BUFFER_SIZE  65535
//input buffer
array<unsigned char,1>^ buf = gcnew array<unsigned char,1>(SHA1_BUFFER_SIZE);
pin_ptr<unsigned char> pointer = &buf[0];

//Open file in 64-bit mode
FILE *file = _fopeni64("some_large_file.txt","rb");
SHA1CryptoServiceProvider^ SHA1 = gcnew SHA1CryptoServiceProvider();

//Move pointer to End of File
_fseeki64(file,0,SEEK_END);
//Read pointer position (file size)
unsigned __int64 size = (__int64)_ftelli64(file);

// Move pointer to begining of file
_fseeki64(file,0,SEEK_SET);
__int64 i = 1; // counter
float wyn = 0; // help variable for progress Percentage (float)
__int64 conv = 0; // help variable for progress Percentage (int)

//output buffer
array<unsigned char,1>^ outputbuffer = gcnew array<unsigned char,1>(SHA1_BUFFER_SIZE);
while(1)
{
//Read SHA1_BUFFER_SIZE bytes to buffer
size_t bufLen = fread( pointer, 1, SHA1_BUFFER_SIZE, file );
if (bufLen == 0) //End of file
{
if (ferror(file)) //Error opening file
return;
break;
}
//buffer has the last block of bytes of the file
if ( SHA1_BUFFER_SIZE*i >= size )
SHA1->TransformFinalBlock(buf,0,bufLen);
else
SHA1->TransformBlock(buf,0,bufLen,outputbuffer,0);

wyn = SHA1_BUFFER_SIZE*100; /* Getting */
wyn /= size; /* the */
wyn *= i; /* progress */
conv = wyn; /* Percentage */
ComputeSHA1->ReportProgress(conv);
\\Update our progressBar
i++;
} //End main loop

String^ sHash = "";
//Get the computed hash and convert to System::String
sHash = BitConverter::ToString(SHA1->Hash);
//Replace the '-' characters in hash to white spaces
sHash = sHash->Replace('-',' ');
//Removing whitespaces from hash
sHash = System::Text::RegularExpressions::Regex::Replace(sHash, "\\s+", System::String::Empty);

//Filling a textBox with the SHA1
ComputeSHA1->ReportProgress(0,sHash);

关于.net - 使用 SHA1CryptoServiceProvider 获取正在计算的 SHA1 的进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6493220/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com