2012-05-17 5 views
0

Je travaille avec une grande chaîne en C#. Par exemple, la longueur de la chaîne est de 2 000 000 caractères. Je dois crypter cette chaîne. Je dois l'enregistrer sous forme de fichier texte sur un disque dur. J'ai essayé de crypter en utilisant XOR pour le cryptage de texte le plus rapide et de base, mais prend encore un cryptage trop long. Il faut 1 heure avec le duo cpu 2,13 GHz et 3 Go de RAM. En outre, l'enregistrement du fichier (en utilisant la méthode Write StreamWriter) et la lecture du fichier (en utilisant la méthode StreamReader ReadToEnd) prennent trop de temps.Travailler avec une grande chaîne

Le code:

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; 
} 

Quel est votre conseil pour ces opérations?

+0

Vous voulez donc crypter un fichier texte? – Magnus

+2

C'est l'obfuscation au mieux – CodesInChaos

+0

Pourquoi appelles-tu ConvertFromUtf32? Je veux dire, ce n'est pas comme si vous appeliez ConvertToUtf32 en premier. Alors qu'on peut y aller aussi. –

Répondre

4

Je suggère d'utiliser StringBuilder au lieu de chaîne pour les grandes chaînes, est également préférable de montrer votre code pour voir si toute autre optimisation est possible. par exemple, pour lire/écrire depuis/dans des fichiers, vous pouvez utiliser des tampons.

Mise à jour: Comme je vois dans votre code plus gros problème (avec ce code) est dans cette ligne:

newText += char.ConvertFromUtf32(charValue); 

String est objet immutable et par += opérateur chaque fois que vous allez créer une nouvelle instance de newText et quand la longueur est grande ce qui provoque à temps et des problèmes de mémoire, donc au lieu de string si vous utilisez StringBuilder cette ligne de code sera comme ceci:

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

et cette fonction sera exécutée extrêmement rapidement.

+0

@ user1400531, Voir ma mise à jour et il était préférable de ne pas supprimer votre commentaire pour conserver l'historique de votre code mis à jour. –

+0

Oui, '+ =' est un problème; il crée une nouvelle chaîne à chaque fois, ce qui créerait 2 000 000 nouvelles chaînes au total. Mais je ne suis pas sûr si c'est le seul goulot d'étranglement. Est-ce que créer 2 000 000 de chaînes prend une heure sur une machine 2GHz? –

+1

@MrLister, je pense que cela provoque des problèmes de mémoire et garbage collector ne fonctionne pas correctement dans ce cas, aussi oui ce n'est pas le seul buttleneck dans le système, il y a quelques autres buttlenecks comme 'Convert.ToInt32 (texte [i]); 'ou' char.ConvertFromUtf32 (charValue); 'mais je pense que' + = 'est le plus gros problème ici. –

Questions connexes