public override string Get(string array) { if (array == null) { throw new ArgumentNullException("value"); } if (array.Length == 0) { return(""); } int length = array.Length; for (int index = 0; index < array.Length; ++index) { length += length << 7 ^ (int)array[index]; } int num1 = length - (length >> 17); int num2 = num1 - (num1 >> 11); int num3 = num2 - (num2 >> 5); for (NameTable.Entry entry = this.entries[num3 & this.mask]; entry != null; entry = entry.next) { if (entry.hashCode == num3 && string.Compare(entry.str, array) == 0) { return(entry.str); } } return((string)null); }
public override string Add(char[] array, int offset, int length) { if (length == 0) { return(""); } int num1 = length; int num2 = num1 + (num1 << 7 ^ (int)array[offset]); int num3 = offset + length; for (int index = offset + 1; index < num3; ++index) { num2 += num2 << 7 ^ (int)array[index]; } int num4 = num2 - (num2 >> 17); int num5 = num4 - (num4 >> 11); int hashCode = num5 - (num5 >> 5); for (NameTable.Entry entry = this.entries[hashCode & this.mask]; entry != null; entry = entry.next) { if (entry.hashCode == hashCode && NameTable.TextEquals(entry.str, array, offset)) { return(entry.str); } } return(this.AddEntry(new string(array, offset, length), hashCode)); }
private string AddEntry(string str, int hashCode) { int index = hashCode & this.mask; NameTable.Entry entry = new NameTable.Entry(str, hashCode, this.entries[index]); this.entries[index] = entry; if (this.count++ == this.mask) { this.Grow(); } return(entry.str); }
private void Grow() { int num = this.mask * 2 + 1; NameTable.Entry[] entries = this.entries; NameTable.Entry[] entryArray = new NameTable.Entry[num + 1]; NameTable.Entry next; for (int index1 = 0; index1 < entries.Length; ++index1) { for (NameTable.Entry entry = entries[index1]; entry != null; entry = next) { int index2 = entry.hashCode & num; next = entry.next; entry.next = entryArray[index2]; entryArray[index2] = entry; } } this.entries = entryArray; this.mask = num; }
internal Entry(string str, int hashCode, NameTable.Entry next) { this.str = str; this.hashCode = hashCode; this.next = next; }