Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SHA-1哈希字节数组与文件流_C#_Sha1 - Fatal编程技术网

C# SHA-1哈希字节数组与文件流

C# SHA-1哈希字节数组与文件流,c#,sha1,C#,Sha1,我正在编写一个API,允许用户上传文件(图像、视频等)。我使用SHA-1散列来确保同一个文件不会被上传多次。以前我们只允许较小的文件,所以我将它们读入字节数组并进行散列,但现在我们允许较大的文件,所以我使用文件流。问题是SHA-1算法返回不同的散列。我需要弄清楚如何获得相同的哈希值,而不考虑方法,即使我必须将字节数组转换为文件流或其他内容。但是,我尝试将字节数组写入临时文件并读取它,它返回与字节数组相同的哈希值。下面是一个示例控制台应用程序,它显示了我正在做的事情: static void Ma

我正在编写一个API,允许用户上传文件(图像、视频等)。我使用SHA-1散列来确保同一个文件不会被上传多次。以前我们只允许较小的文件,所以我将它们读入字节数组并进行散列,但现在我们允许较大的文件,所以我使用文件流。问题是SHA-1算法返回不同的散列。我需要弄清楚如何获得相同的哈希值,而不考虑方法,即使我必须将字节数组转换为文件流或其他内容。但是,我尝试将字节数组写入临时文件并读取它,它返回与字节数组相同的哈希值。下面是一个示例控制台应用程序,它显示了我正在做的事情:

static void Main(string[] args)
{
    string file = "C:\\CUWCDFileStorage\\temp\\test.png";
    var bytes = File.ReadAllBytes(file);
    using (var stream = File.Open(file, FileMode.Open))
    {
        Console.WriteLine(Sha1HashFile(bytes));   // Returns B7F6D90C30233F91FCEFE05FB49679F8B26C9D80
        Console.WriteLine(Sha1HashFile(stream));  // Returns DA39A3EE5E6B4B0D3255BFEF95601890AFD80709
        Console.WriteLine(Sha1HashFile2(bytes));  // Returns B7F6D90C30233F91FCEFE05FB49679F8B26C9D80
    }

    Console.Read();
}

public static string Sha1HashFile(byte[] file)
{
    using (SHA1Managed sha1 = new SHA1Managed())
    {
        return BitConverter.ToString(sha1.ComputeHash(file)).Replace("-", "");
    }
}

public static string Sha1HashFile(Stream stream)
{
    using (SHA1Managed sha1 = new SHA1Managed())
    {
        return BitConverter.ToString(sha1.ComputeHash(stream)).Replace("-", "");
    }
}

public static string Sha1HashFile2(byte[] bytes)
{
    string file = "C:\\CUWCDFileStorage\\temp\\test2.png";
    File.WriteAllBytes(file, bytes);
    return Sha1HashFile(File.OpenRead(file));
}
我甚至试着用
新的内存流(bytes)
将字节数组放入
内存流中,但这也不起作用。似乎一旦我将文件放入字节数组中,就无法将其放回原处

编辑:

我从示例中删除了一些代码,因为我认为MD5可以工作。下面是我用来测试的原始代码:

static void Main(string[] args)
{
    string file = "C:\\CUWCDFileStorage\\temp\\test.png";
    var bytes = File.ReadAllBytes(file);
    using (var stream = File.Open(file, FileMode.Open))
    {
        Console.WriteLine(Md5HashFile(bytes));
        Console.WriteLine(Md5HashFile(stream));
        Console.WriteLine(Sha1HashFile(bytes));
        Console.WriteLine(Sha1HashFile(stream));
        Console.WriteLine(Sha1HashFile2(bytes));
    }

    Console.Read();
}

public static string Md5HashFile(byte[] file)
{
    using (MD5 md5 = MD5.Create())
    {
        return BitConverter.ToString(md5.ComputeHash(file)).Replace("-", "");
    }
}

public static string Sha1HashFile(byte[] file)
{
    using (SHA1Managed sha1 = new SHA1Managed())
    {
        return BitConverter.ToString(sha1.ComputeHash(file)).Replace("-", "");
    }
}

public static string Md5HashFile(Stream stream)
{
    using (MD5 md5 = MD5.Create())
    {
        return BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", "");
    }
}

public static string Sha1HashFile(Stream stream)
{
    using (SHA1Managed sha1 = new SHA1Managed())
    {
        return BitConverter.ToString(sha1.ComputeHash(stream)).Replace("-", "");
    }
}

public static string Sha1HashFile2(byte[] bytes)
{
    string file = "C:\\CUWCDFileStorage\\temp\\test2.png";
    File.WriteAllBytes(file, bytes);
    return Sha1HashFile(File.OpenRead(file));
}

有关此问题的解释,请参阅下面的答案。

问题在于,在对第一种方式进行哈希运算时,流被读取到了末尾。这导致第二个散列错误。因此,我需要为第二次哈希重新打开一个流,或者在第二次哈希之前将流倒带到开头。以下是解决方案:

static void Main(string[] args)
{
    string file = "C:\\CUWCDFileStorage\\temp\\test.png";
    var bytes = File.ReadAllBytes(file);
    using (var stream = File.Open(file, FileMode.Open))
    {
        Console.WriteLine(Md5HashFile(bytes));
        Console.WriteLine(Md5HashFile(stream));
    }

    using (var stream = File.Open(file, FileMode.Open))
    {
        Console.WriteLine(Sha1HashFile(bytes));
        Console.WriteLine(Sha1HashFile(stream));
        Console.WriteLine(Sha1HashFile2(bytes));
    }

    Console.Read();
}

public static string Md5HashFile(byte[] file)
{
    using (MD5 md5 = MD5.Create())
    {
        return BitConverter.ToString(md5.ComputeHash(file)).Replace("-", "");
    }
}

public static string Sha1HashFile(byte[] file)
{
    using (SHA1Managed sha1 = new SHA1Managed())
    {
        return BitConverter.ToString(sha1.ComputeHash(file)).Replace("-", "");
    }
}

public static string Md5HashFile(Stream stream)
{
    using (MD5 md5 = MD5.Create())
    {
        return BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", "");
    }
}

public static string Sha1HashFile(Stream stream)
{
    using (SHA1Managed sha1 = new SHA1Managed())
    {
        return BitConverter.ToString(sha1.ComputeHash(stream)).Replace("-", "");
    }
}

public static string Sha1HashFile2(byte[] bytes)
{
    string file = "C:\\CUWCDFileStorage\\temp\\test2.png";
    File.WriteAllBytes(file, bytes);
    return Sha1HashFile(File.OpenRead(file));
}

你问题中的代码是真实的代码吗?你试过按照这里写的那样运行代码吗?因为,您问题中的代码示例很好,不会产生不同的哈希值……另外值得注意的是,您列出的第二个哈希值是一个空流的哈希值。我想可能是流跳过了一些前导字节。不太可能,但这是我能想出的最好办法。您能否将流的前3-4字节与数组的前3-4字节进行比较?他们一模一样吗?@elgonzo你说得对。下面的例子是我实际测试的内容,现在我知道问题出在哪里了。