可以安全地重用 MD5CryptoServiceProvider 来计算多线程代码中的 md5 哈希吗?

Posted

技术标签:

【中文标题】可以安全地重用 MD5CryptoServiceProvider 来计算多线程代码中的 md5 哈希吗?【英文标题】:Can MD5CryptoServiceProvider be safely reused to compute md5 hashes in multithreaded code? 【发布时间】:2021-11-09 20:27:25 【问题描述】:

我假设计算 md5 哈希是一个纯确定性函数,因此我假设使用单个 C# MD5CryptoServiceProvider 实例来计算多线程代码中的哈希应该是安全的,因为我假设 md5 计算将被实现为纯函数。

我不知道实现的细节,但我很惊讶它实现了 IDisposable,因为我不明白我认为作为纯函数实现的东西需要什么样的清理。

那么我是否正确地假设在多线程代码中对 MD5CryptoServiceProvider 的单个实例调用 MD5CryptoServiceProvider.ComputeHash 是安全的?

【问题讨论】:

简单地为每个线程创建一个新的MD5CryptoServiceProvider 有什么缺点? 只有一个静态实例更简单。 【参考方案1】:

你的假设是正确的。

我不知道实现的细节,但我很惊讶它 实现 IDisposable,

为什么感到惊讶?我希望这种方法依赖于操作系统级别的加密功能,这些功能可能作为 COM 接口实现,并且在不再使用时可能会很好地释放。

它甚至这么说:“使用加密服务提供商 (CSP) 提供的实现。”

查看源(而不是想知道),您只需使用 google 即可找到指向 https://referencesource.microsoft.com/#mscorlib/system/security/cryptography/md5cryptoserviceprovider.cs 的源 - 涉及的句柄也在该 dispose 调用中处理。

您似乎认为这是在运行本机代码 - 这可能是,也可能不是,并且在 Windows 上,当它已经在操作系统中时重新实现它几乎没有意义。

【讨论】:

以上是关于可以安全地重用 MD5CryptoServiceProvider 来计算多线程代码中的 md5 哈希吗?的主要内容,如果未能解决你的问题,请参考以下文章

可以安全地重用 MD5CryptoServiceProvider 来计算多线程代码中的 md5 哈希吗?

如何在 C++ 中安全地实现可重用的暂存存储器?

Hibernate 3 - 安全地重用 IntegerType/StringType 等对象?

我们如何使用 HiveWarehouseConnector 安全地重用读取 Hive 表的数据框?

希望在 iPhone 故事板应用程序中最大限度地重用

如何有效地使用 javax.mail API 发送批量邮件? & 我们可以使用重用认证会话来提高速度吗?