2012-05-17 6 views
0

Я работаю с большой строкой в ​​C#. Например, моя длина строки составляет 2.000.000 символов. Я должен зашифровать эту строку. Я должен сохранить его как текстовый файл на жестком диске. Я попытался зашифровать, используя XOR для быстрого и простого шифрования текста, но все еще занимает слишком длинное шифрование. Требуется 1 час с дуплексным процессором 2,13 ГГц и 3 ГБ оперативной памяти. Кроме того, сохранение файла (с использованием метода записи StreamWriter) и чтение из файла (с использованием метода StreamReader ReadToEnd) занимает слишком много времени.Работа с большой строкой

Код:

public static string XorText(string text) 
{ 
    string newText = ""; 
    int key = 1; 
    int charValue; 
    for (int i = 0; i < text.Length; i++) 
    { 
    charValue = Convert.ToInt32(text[i]); //get the ASCII value of the character 
    charValue ^= key; //xor the value 
    newText += char.ConvertFromUtf32(charValue); //convert back to string 
    } 
    return newText; 
} 

Что вы посоветуете для этих операций?

+0

Итак, вы хотите зашифровать текстовый файл? – Magnus

+2

Это путаница в лучшем случае – CodesInChaos

+0

Зачем вы называете ConvertFromUtf32? Я имею в виду, что вы не первый раз вызываете ConvertToUtf32. Так что тоже можно идти. –

ответ

4

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

Update: Как я могу видеть в коде самой большой проблемой (с этим кодом) в этой строке:

newText += char.ConvertFromUtf32(charValue); 

String является immutable объект, и по += оператора каждый раз, когда вы будете создавать новый экземпляр newText и когда длина большой это приводит к времени и памяти проблем, поэтому вместо string если вы используете StringBuilder эта строка кода будет как это:

newText.Append(char.ConvertFromUtf32(charValue)); 

, и эта функция будет работать очень быстро.

+0

@ user1400531, см. Мое обновление, и было бы лучше не удалять ваш комментарий, чтобы сохранить историю вашего обновленного кода. –

+0

Да, '+ =' - проблема; он создает новую строку каждый раз, чтобы создать всего 2 000 000 новых строк. Но я не уверен, что это единственное узкое место. Создает ли 2 000 000 строк час на машине с частотой 2 ГГц? –

+1

@MrLister, я думаю, что это вызывает проблемы с памятью, и сборщик мусора в этом случае не работает должным образом. Также да, это не единственное место в системе, есть некоторые другие ноты, такие как Convert.ToInt32 (текст [i]); 'или' char.ConvertFromUtf32 (charValue); 'но я думаю, что' + = 'является самой большой проблемой здесь. –

Смежные вопросы