C#MD5哈希器示例

C#MD5哈希器示例,c#,hash,md5,C#,Hash,Md5,编辑:我已将其重新命名为一个示例,因为代码按预期工作 我正在尝试复制一个文件,获取MD5哈希,然后删除该副本。我这样做是为了避免对原始文件(另一个应用程序写入)的进程锁定。但是,我正在锁定我复制的文件 File.Copy(pathSrc, pathDest, true); String md5Result; StringBuilder sb = new StringBuilder(); MD5 md5Hasher = MD5.Create(); using (FileStream fs =

编辑:我已将其重新命名为一个示例,因为代码按预期工作

我正在尝试复制一个文件,获取MD5哈希,然后删除该副本。我这样做是为了避免对原始文件(另一个应用程序写入)的进程锁定。但是,我正在锁定我复制的文件

File.Copy(pathSrc, pathDest, true);

String md5Result;
StringBuilder sb = new StringBuilder();
MD5 md5Hasher = MD5.Create();

using (FileStream fs = File.OpenRead(pathDest))
{
    foreach(Byte b in md5Hasher.ComputeHash(fs))
        sb.Append(b.ToString("x2").ToLower());
}

md5Result = sb.ToString();

File.Delete(pathDest);
然后,我在
file.Delete()
”上遇到“进程无法访问文件”异常

我希望通过
using
语句,文件流可以很好地关闭。我还尝试分别声明文件流,使用删除
,并在读取后放置
fs.Close()
fs.Dispose()


在这之后,我注释掉了实际的md5计算,代码执行,文件被删除,因此看起来这与
ComputeHash(fs)

有关。您是否也尝试过将md5对象包装到using()中?从文档中可以看出,MD5是一次性的。这可能会使它放弃文件。

在删除文件之前,您是否尝试过将md5Hasher设置为null?它可能有一个句柄仍然连接到文件流(可能是内存泄漏)。

为什么不使用FileShare.ReadWrite打开文件?

在循环完成之后。我将您的代码放在控制台应用程序中运行,没有错误,得到了哈希值,测试文件在执行结束时被删除?我刚刚使用测试应用程序中的.pdb作为文件

您正在运行哪个版本的.NET

我把我的代码放在这里,如果你把它放在VS2008.NET3.5SP1的控制台应用程序中,它运行时不会出错(至少对我来说是这样)

导入名称空间

using System.Security.Cryptography;
下面是返回md5哈希代码的函数。您需要将字符串作为参数传递

public static string GetMd5Hash(string input)
{
        MD5 md5Hash = MD5.Create();
        // Convert the input string to a byte array and compute the hash.
        byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input));

        // Create a new Stringbuilder to collect the bytes
        // and create a string.
        StringBuilder sBuilder = new StringBuilder();

        // Loop through each byte of the hashed data 
        // and format each one as a hexadecimal string.
        for (int i = 0; i < data.Length; i++)
        {
            sBuilder.Append(data[i].ToString("x2"));
        }

        // Return the hexadecimal string.
        return sBuilder.ToString();
}
public静态字符串GetMd5Hash(字符串输入)
{
MD5 md5Hash=MD5.Create();
//将输入字符串转换为字节数组并计算哈希。
byte[]data=md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input));
//创建新的Stringbuilder以收集字节
//并创建一个字符串。
StringBuilder sBuilder=新StringBuilder();
//循环遍历散列数据的每个字节
//并将每个字符串格式化为十六进制字符串。
for(int i=0;i
你为什么不直接调用ReadAllBytes()并完成它呢?因为他对computeHash的调用是在一个流上进行的-如果文件很大,他就不需要将其全部保存在内存中。你不需要在删除文件之前关闭该文件吗?是的,你可能想抽象一个函数,该函数使用文件名并返回一个哈希字符串。代码确实有效,我是n00b。在MD5hash锁定文件后,我重新使用了该文件。这是个坏主意吗?我帮他弄明白为什么密码不起作用。复制一个大文件以防止它被锁定并不是世界末日。我的回答是他的代码确实有效,并且创建了一个示例来说明这一点,你到底在说什么@阿明,你能提供更多的上下文吗?将一个变量设置为null对它是否仍在内存中以及是否仍保留某些资源没有直接影响。垃圾回收器及其终结器不太可能在将变量设置为null的代码和随后的代码行之间插入。事实上,编译器可能会忽略将变量设置为null的行。它肯定不会触发处理、垃圾收集或终结。
public static string GetMd5Hash(string input)
{
        MD5 md5Hash = MD5.Create();
        // Convert the input string to a byte array and compute the hash.
        byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input));

        // Create a new Stringbuilder to collect the bytes
        // and create a string.
        StringBuilder sBuilder = new StringBuilder();

        // Loop through each byte of the hashed data 
        // and format each one as a hexadecimal string.
        for (int i = 0; i < data.Length; i++)
        {
            sBuilder.Append(data[i].ToString("x2"));
        }

        // Return the hexadecimal string.
        return sBuilder.ToString();
}