Tôi đang gặp sự cố với một số mã tôi duy trì. Mã bên dưới có thành viên private static SHA1
(là IDisposable
nhưng vì nó là static
, nên không bao giờ được hoàn tất). Tuy nhiên, khi bị căng thẳng mã này ném một ngoại lệ cho thấy nó đã bị đóng cửa:Tại sao SHA1.ComputeHash không hoạt động dưới tải cao với nhiều luồng?
Caught exception. Safe handle has been closed"
Stack trace: Call stack where exception was thrown
at System.Runtime.InteropServices.SafeHandle.DangerousAddRef(Boolean& success)
at System.Security.Cryptography.Utils.HashData(SafeHashHandle hHash, Byte[] data, Int32 cbData, Int32 ibStart, Int32 cbSize)
at System.Security.Cryptography.Utils.HashData(SafeHashHandle hHash, Byte[] data, Int32 ibStart, Int32 cbSize)
at System.Security.Cryptography.HashAlgorithm.ComputeHash(Byte[] buffer)
Mã này trong câu hỏi là:
internal class TokenCache
{
private static SHA1 _sha1 = SHA1.Create();
private string ComputeHash(string password)
{
byte[] passwordBytes = UTF8Encoding.UTF8.GetBytes(password);
return UTF8Encoding.UTF8.GetString(_sha1.ComputeHash(passwordBytes));
}
Câu hỏi của tôi rõ ràng là những gì có thể gây ra vấn đề này. Có thể gọi tới số SHA1.Create
không thành công (có bao nhiêu tài nguyên mã hóa)? Điều này có thể được gây ra bởi appdomain đi xuống?
Bất kỳ lý thuyết nào khác?
gì này có liên quan gì với Vứt bỏ? Ngoài ra, lớp "SHA1" là gì? –
Bạn có chắc chắn lớp SHA1 là chủ đề an toàn không? Bạn có thể lấy mật khẩu được băm khi nó không thành công? – Rob
@John Saunders, xin lỗi bạn đã đúng. Điều này không liên quan gì đến Vứt bỏ. Tôi nghĩ rằng finalizer trên System.Security.Cryptography.SHA1CryptoServiceProvider có thể đã được kích hoạt bằng cách nào đó. http://msdn.microsoft.com/en-us/library/e7hyyd4e(v=vs.110).aspx – MvdD