2014-12-17 3 views
1

в моем веб-приложении i m с использованием AES для шифрования или дешифрования данных. Согласно моему поиску, это один из самых быстрых алгоритмов шифрования, и на самом деле это очень быстро, я думаю.производительность при шифровании и расшифровке

, но иногда мне действительно нужно зашифровать или расшифровать многие строки, и это вызывает проблемы с производительностью.

для этого способа я думал, что могу использовать словарь для хранения зашифрованных и простых версий строки, чтобы во второй раз я мог получить зашифрованную строку из экземпляра словаря. Ниже код - моя реализация словаря.

private static Dictionary<string, string> _veryFastDict; 

    public static Dictionary<string, string> GetVeryFastDictInstance() 
    { 
     return _veryFastDict ?? (_veryFastDict = new Dictionary<string, string>()); 
    } 

и код шифрования ниже

public static string VeryFastEncrypt(string text) 
    { 
     if (GetVeryFastDictInstance().ContainsKey(text)) 
     { 
      return GetVeryFastDictInstance()[text]; 
     } 

     ///string encryptedText 
     /// encryption code 

     GetVeryFastDictInstance().Add(text,encryptedKey); 

     return encryptedKey; 
    } 

это хороший подход и есть ли возможная проблема такого подхода?

ответ

2

Да, вместо того, чтобы переделывать одну и ту же работу, хорошо хранить зашифрованные результаты в некоторой структуре данных. Это экономит время пересчета одного и того же зашифрованного сообщения.

Эта стратегия полезна, когда у вас меньше строк шифрования, но много вхождений этих строк.

Но это также может быть проблемой размер, Если у вас есть много строк, которые необходимо зашифровать, но они имеют меньше случаев. Это может ухудшить производительность, поскольку она будет увеличивать размер структуры данных (возможно, хеш-карту, хэш-таблицу, хотя она имеет возможность поиска O (1)). Потребность в памяти увеличится.

В таких ситуациях шифрование большого блока данных является обходным путем. Поскольку AES является блочным шифром. Он работает на кусках данных, и это действительно быстро для больших нет. блоков. Но для небольших данных это менее предпочтительным, поскольку накладные расходы на шифрование являются более чем преимуществом.

Вывод:

  1. Использования структура данных словарь, хэш-карта и т.д. для хранения пара ПТА-CT, если меньше строк и больше вхождений присутствуют. Учитывайте структуру данных.
  2. Использовать шифрование один раз и заменить весь подход к вхождению (для этого подхода вам не нужна дополнительная структура данных)
  3. Для большего количества строк и меньше случаев проверьте вариант 2 или блокировать шифрование.
1

Его приемлемый вариант, но я вижу здесь следующие проблемы.

  1. Вы не блокируете вызов .add(), поэтому вы можете привести к поврежденным данным, поскольку словарь является статическим.
  2. Вы не заботитесь о том, чтобы получить слишком много данных в вашем словаре. Вы должны позаботиться о том, чтобы время от времени удаляли некоторые данные, иначе вы можете съесть всю свою память, если ваши данные слишком сильно вырастут. Словарь хорош, чтобы найти строку, потому что сделайте внутреннюю индексацию, но если ваши данные будут слишком много, тогда вы можете потерять производительность, потому что каждый раз, когда вы вставляете новую строку, это займет больше времени ... так что вы можете подумать добавьте дополнительный счетчик с каждой строкой и подсчитайте, сколько раз используется, поэтому вы сохраняете только минимум строки ... и удаляете время до времени.
Смежные вопросы