我需要计算在线图片的MD5哈希值。
对于本地保存的图像,我尝试了这段代码,结果和预期的一样。
public static string GetHashFromFile(string fileName, HashAlgorithm algorithm)
{
HashAlgorithm MD5 = new MD5CryptoServiceProvider();
using (var stream = new BufferedStream(File.OpenRead(fileName), 100000))
{
return BitConverter.ToString(MD5.ComputeHash(stream)).Replace("-", string.Empty);
}
}
我如何获得在线文件的BufferedStream?
使用 WebClient 类来下载给定地址的数据。使用下载的字节数组来创建一个 记忆流 对象的源流,作为 缓冲流 对象。
你有两种方式下载。
1. 同步方式
static string GetHashFromUrl(string url)
{
using (var wc = new WebClient())
{
var bytes = wc.DownloadData(url);
using (var md5 = new MD5CryptoServiceProvider())
using (var ms = new MemoryStream(bytes))
using (var bs = new BufferedStream(ms, 100_000))
return BitConverter.ToString(md5.ComputeHash(bs)).Replace("-", string.Empty);
}
}
.和来电者。
void TheCaller()
{
try
{
var url = "TheAddressOfTheImage";
var hash = GetHashFromUrl(url);
//...
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
2. 异步方式
static async Task<string> GetHashFromUrlAsync(string url)
{
using (var wc = new WebClient())
using (var md5 = new MD5CryptoServiceProvider())
{
byte[] bytes = await wc.DownloadDataTaskAsync(url);
using (var ms = new MemoryStream(bytes))
using (var bs = new BufferedStream(ms, 100_000))
return BitConverter.ToString(md5.ComputeHash(bs)).Replace("-", string.Empty);
}
}
...和来电者。
void TheCaller()
{
try
{
var url = "TheAddressOfTheImage";
var hash = Task.Run(async () => await GetHashFromUrlAsync(url)).Result;
//...
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
...或 async
调用者。
async void TheCaller()
{
try
{
var url = "TheAddressOfTheImage";
var hash = await GetHashFromUrlAsync(url);
//...
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
两个函数都返回 FA544EB95534BA35AE9D6EA0B3889934
这是计算出的你的SO照片的哈希值:)