可以安全地重用 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 哈希吗?
Hibernate 3 - 安全地重用 IntegerType/StringType 等对象?