Changeset 850


Ignore:
Timestamp:
Nov 16, 2009, 2:50:35 PM (12 years ago)
Author:
kopal
Message:

profiled cost function (coincidence/entropy), some time optimization

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/CrypPlugins/CostFunction/CostFunction.cs

    r848 r850  
    274274        public double calculateIndexOfCoincidence(byte[] text)
    275275        {
     276            return calculateIndexOfCoincidence(text, text.Length);
     277        }
     278
     279        /// <summary>
     280        /// Calculates the Index of Coincidence multiplied with 100 of
     281        /// a given byte array
     282        ///
     283        /// for example a German text has about 7.62
     284        ///           an English text has about 6.61
     285        /// </summary>
     286        /// <param name="text">text to use</param>
     287        /// <param name="text">bytesToUse</param>
     288        /// <returns>Index of Coincidence</returns>
     289        public double calculateIndexOfCoincidence(byte[] text, int bytesToUse)
     290        {
     291            if (bytesToUse > text.Length)
     292                bytesToUse = text.Length;
    276293
    277294            double[] n = new double[256];
    278295            //count all ASCII symbols
     296            int counter = 0;
    279297            foreach (byte b in text)
    280298            {
    281299                    n[b]++;
     300                    counter++;
     301                    if (counter == bytesToUse)
     302                        break;
    282303            }
    283304
     
    289310            }
    290311
    291             coindex = coindex / (text.Length);
    292             coindex = coindex / (text.Length - 1);
     312            coindex = coindex / (bytesToUse);
     313            coindex = coindex / (bytesToUse - 1);
    293314
    294315            return coindex * 100;
     
    304325        public double calculateEntropy(byte[] text)
    305326        {
     327            return calculateEntropy(text, text.Length);
     328        }
     329
     330        /// <summary>
     331        /// Calculates the Entropy of a given byte array
     332        /// for example a German text has about 4.0629
     333        /// </summary>
     334        /// <param name="text">text to use</param>
     335        /// <returns>Entropy</returns>
     336        public double calculateEntropy(byte[] text, int bytesToUse)
     337        {
     338            if (bytesToUse > text.Length)
     339                bytesToUse = text.Length;
    306340
    307341            double[] n = new double[256];
    308342            //count all ASCII symbols
     343            int counter = 0;
    309344            foreach (byte b in text)
    310345            {
    311346                    n[b]++;
     347                    counter++;
     348                    if (counter == bytesToUse)
     349                        break;
    312350            }
    313351
     
    316354            for (int i = 0; i < n.Length; i++)
    317355            {
    318                 double pz = n[i] / text.Length; //probability of character n[i]
     356                double pz = n[i] / bytesToUse; //probability of character n[i]
    319357                if (pz > 0)
    320358                    entropy = entropy + pz * Math.Log(pz, 2);
     
    506544                throw new Exception("Entered bytesToUse is not an integer: " + ex.Message);
    507545            }
    508            
    509             if (bytesToUse > text.Length)
    510                 bytesToUse = 0;
    511 
    512             byte[] array;
    513 
    514             if (bytesToUse > 0)
    515             {
    516                 //Create a new Array of size of bytesToUse if needed
    517                 array = new byte[bytesToUse];
    518                 for (int i = 0; i < bytesToUse && i < text.Length; i++)
    519                 {
    520                     array[i] = text[i];
    521                 }
    522             }
    523             else
    524             {
    525                 array = text;
    526             }
    527546
    528547            switch (((CostFunctionSettings)this.plugin.Settings).FunctionType)
    529548            {
    530549                case 0: //Index of coincidence
    531                     return plugin.calculateIndexOfCoincidence(array);
     550                    return plugin.calculateIndexOfCoincidence(text, bytesToUse);
    532551                case 1: //Entropy
    533                     return plugin.calculateEntropy(array);
     552                    return plugin.calculateEntropy(text, bytesToUse);
    534553                case 2: // Bigrams: log 2
    535                     return plugin.calculateNGrams(plugin.ByteArrayToString(array), 2, 2);
     554                    return plugin.calculateNGrams(plugin.ByteArrayToString(text), 2, 2);
    536555                case 3: // Bigrams: Sinkov
    537                     return plugin.calculateNGrams(plugin.ByteArrayToString(array), 2, 3);
     556                    return plugin.calculateNGrams(plugin.ByteArrayToString(text), 2, 3);
    538557                case 4: // Bigrams: Percentaged
    539                     return plugin.calculateNGrams(plugin.ByteArrayToString(array), 2, 1);
     558                    return plugin.calculateNGrams(plugin.ByteArrayToString(text), 2, 1);
    540559                default:
    541560                    throw new NotImplementedException("The value " + ((CostFunctionSettings)this.plugin.Settings).FunctionType + " is not implemented.");
Note: See TracChangeset for help on using the changeset viewer.