Функция FindEntry в Dictionary.cs
Я смотрел на реализацию словаря в .NET, так как я хотел понять, что делает словарь ContainsKey и поиск быстрым:http://referencesource.microsoft.com/#mscorlib/system/collections/generic/dictionary.cs,15debc34d286fdb3
Функция ContainsKey в основном приводит к перечислению FindEntry, указанному ниже:
buckets - это массив целых чисел, а записи - это массив объектов Entry, которые представляют собой структуры, содержащие HashCode, TKey и TValue.
Итак, я понимаю, что этот поиск быстрый, так как это простой поиск по массиву.
private int FindEntry(TKey key) {
if( key == null) {
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.key);
}
if (buckets != null) {
int hashCode = comparer.GetHashCode(key) & 0x7FFFFFFF;
for (int i = buckets[hashCode % buckets.Length]; i >= 0; i = entries[i].next) {
if (entries[i].hashCode == hashCode && comparer.Equals(entries[i].key, key)) return i;
}
}
return -1;
}
Однако я пытаюсь понять эти 2 строки:
int hashCode = comparer.GetHashCode(key) & 0x7FFFFFFF;
for (int i = buckets[hashCode % buckets.Length]; i >= 0; i = entries[i].next)
1) Если я правильно понял 0x7FFFFFFF, это гарантирует, что мы не получим отрицательное значение. Так что же возвращает первая строка? Это простое число или простое число?
2) Во второй строке, почему мы инициализируем i в buckets [hashCode% buckets.Length]?