Changeset 873


Ignore:
Timestamp:
Nov 20, 2009, 11:31:16 AM (12 years ago)
Author:
Matthäus Wander
Message:

WordPatterns:

  • changed Pattern class to struct
  • changed hashcode algorithm to real FNV-1
File:
1 edited

Legend:

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

    r632 r873  
    181181        }
    182182
    183         internal class Pattern
    184         {
    185             private const int prime = 31;
    186 
    187             private int[] patternArray;
    188             private int hashCode = 1;
     183        internal struct Pattern
     184        {
     185            private const int PRIME = 16777619;
     186
     187            private readonly int[] patternArray;
     188            private readonly int hashCode;
    189189
    190190            internal Pattern(string word)
    191191            {
    192192                patternArray = new int[word.Length];
     193                hashCode = -2128831035; // int32 counterpart of uint32 2166136261
    193194               
    194195                Dictionary<char, int> seenLetters = new Dictionary<char, int>(15);
     
    206207                    }
    207208
    208                     // Fast hash algorithm similar to FNV.
    209                     hashCode = prime * hashCode + patternArray[i];
     209                    // FNV-1 hashing
     210                    hashCode = (hashCode * PRIME) ^ patternArray[i];
    210211                }
    211212
     
    227228            /// <param name="obj"></param>
    228229            /// <returns></returns>
    229             public override bool Equals(object obj)
    230             {
    231                 // identical object
    232                 if (this == obj)
     230            public override bool Equals(object right)
     231            {
     232                if (right == null)
     233                    return false;
     234
     235                if (object.ReferenceEquals(this, right))
    233236                    return true;
    234237
    235                 // uneven types
    236                 if (!(obj is Pattern))
     238                if (this.GetType() != right.GetType())
    237239                    return false;
    238240
    239                 Pattern another = obj as Pattern;
    240 
    241                 // uneven pattern lengths
    242                 if (patternArray.Length != another.patternArray.Length)
     241                return this == (Pattern)right;
     242            }
     243
     244            public static bool operator==(Pattern left, Pattern right)
     245            {
     246                if (left.hashCode != right.hashCode)
    243247                    return false;
    244248
    245                 for (int i = 0; i < patternArray.Length; i++)
     249                if (left.patternArray.Length != right.patternArray.Length)
     250                    return false;
     251
     252                for (int i = 0; i < left.patternArray.Length; i++)
    246253                {
    247254                    // uneven pattern content
    248                     if (patternArray[i] != another.patternArray[i])
     255                    if (left.patternArray[i] != right.patternArray[i])
    249256                        return false;
    250257                }
    251258
    252259                return true;
     260            }
     261
     262            public static bool operator !=(Pattern left, Pattern right)
     263            {
     264                return !(left == right);
    253265            }
    254266        }
Note: See TracChangeset for help on using the changeset viewer.