Ignore:
Timestamp:
Aug 18, 2009, 12:33:45 PM (12 years ago)
Author:
Matthäus Wander
Message:

WordPatterns:

  • minor performance improvements to Pattern.GetHashCode() and Pattern.Equals(...)
  • added english wordlist
  • added project sample

Changed some Info and Warning messages to Debug to not confuse user (applies to TextInput and Stream/String Converters).

Location:
trunk/CrypPlugins/WordPatterns
Files:
1 added
2 edited

Legend:

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

    r435 r438  
    138138                    Pattern p = new Pattern(word);
    139139
     140                    // two calls to Pattern.GetHashCode()
    140141                    if (!dictPatterns.ContainsKey(p))
    141142                        dictPatterns[p] = new List<string>();
    142143
     144                    // one call to Pattern.GetHashCode() and one to Pattern.Equals()
    143145                    dictPatterns[p].Add(word);
    144146
     
    175177        internal class Pattern
    176178        {
     179            private const int prime = 31;
     180
    177181            private int[] patternArray;
     182            private int hashCode = 1;
    178183
    179184            internal Pattern(string word)
     
    194199                        seenLetters[word[i]] = patternArray[i] = ++letterNumber; // create new letter number
    195200                    }
     201
     202                    // Fast hash algorithm similar to FNV.
     203                    hashCode = prime * hashCode + patternArray[i];
    196204                }
    197205
     
    200208
    201209            /// <summary>
    202             /// Fast hash algorithm similar to FNV.
     210            /// Returns pre-calculated hash code.
    203211            /// </summary>
    204212            /// <returns></returns>
    205213            public override int GetHashCode()
    206214            {
    207                 const int prime = 31;
    208                 int hash = 1;
    209 
    210                 foreach (int x in patternArray)
    211                 {
    212                     hash = prime * hash + x;
    213                 }
    214 
    215                 return hash;
     215                return hashCode;
    216216            }
    217217
     
    223223            public override bool Equals(object obj)
    224224            {
    225                 if (obj.GetType() != typeof(Pattern))
     225                // identical object
     226                if (this == obj)
     227                    return true;
     228
     229                // uneven types
     230                if (!(obj is Pattern))
    226231                    return false;
    227232
    228                 Pattern another = (Pattern)obj;
    229 
     233                Pattern another = obj as Pattern;
     234
     235                // uneven pattern lengths
    230236                if (patternArray.Length != another.patternArray.Length)
    231237                    return false;
     
    233239                for (int i = 0; i < patternArray.Length; i++)
    234240                {
     241                    // uneven pattern content
    235242                    if (patternArray[i] != another.patternArray[i])
    236243                        return false;
  • trunk/CrypPlugins/WordPatterns/WordPatterns.csproj

    r435 r438  
    7373    </None>
    7474  </ItemGroup>
     75  <ItemGroup>
     76    <None Include="WordPatterns_english.txt">
     77      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     78    </None>
     79  </ItemGroup>
    7580  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
    7681  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Note: See TracChangeset for help on using the changeset viewer.