#c#
#c#
Вопрос:
Я забыл свой пароль от сертификата .pfx x509, поэтому я решил, что хочу попробовать использовать его принудительно. Итак, я пошел на тестирование и написал следующий код:
for (var i = 0; i < 1000; i )
{
try
{
var cert = new X509Certificate2("D:/file.pfx", i.ToString(), X509KeyStorageFlags.MachineKeySet);
Console.WriteLine("Found it: " i);
}catch
{
}
}
Я знаю, что это далеко не оптимально, но это не то, о чем мой вопрос. Это было немного медленно, поэтому я подумал, что могу использовать перегрузку RawData вместо указания пути. Итак, я выполнил следующий код:
for (var i = 0; i < 1000; i )
{
try
{
cert = new X509Certificate2(buffer, i.ToString(), X509KeyStorageFlags.MachineKeySet);
Console.WriteLine("Found it: " i);
}catch
{}
}
Где buffer
a byte[]
; Вне цикла я просто загрузил его вместе с необработанными данными из файла с помощью a BinaryReader
.
Только этот код примерно в 3 раза медленнее. Почему это?
Редактировать: я запускал этот код уже 100 раз, так что это не просто случайное совпадение.
Комментарии:
1. Кажется, что ваш заголовок и текст противоречат друг другу, какой из них быстрее? Вариант необработанных данных или тот, в котором вы передаете путь?
2. Мне жаль, что это действительно так. Использование прямого доступа к файлам на самом деле быстрее 😉
3. Я бы предположил, что это связано с тем, что дисковый кэш / диспетчер Windows обрабатывают вещи более эффективно, чем ваш простой байтовый кэш. Хотя интересно.
4. Да, хотя это не имеет смысла, потому что даже если он кэширует диск, ему не нужно ничего кэшировать, потому что я просто использую массив байтов. Я полагаю, что результатом операции дискового ввода-вывода также является массив байтов.
5. Возможно, не нужно читать весь файл, чтобы проверить, верен ли ваш пароль.
Ответ №1:
Возможно, дисковый кэш неуправляемый, поэтому быстрее?