Função FindEntry no Dictionary.cs
Eu estive analisando a implementação do dicionário do .NET, pois queria entender o que torna o dicionário ContainsKey e a pesquisa rápida:http://referencesource.microsoft.com/#mscorlib/system/collections/generic/dictionary.cs,15debc34d286fdb3
A função ContainsKey basicamente leva ao FindEntry listado abaixo:
buckets é uma matriz de números inteiros e as entradas são uma matriz de objetos Entry, que são estruturas que contêm HashCode, TKey e TValue.
Então, eu entendo que essa pesquisa é rápida, pois é uma pesquisa de matriz simples.
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;
}
No entanto, estou tentando entender essas duas linhas:
int hashCode = comparer.GetHashCode(key) & 0x7FFFFFFF;
for (int i = buckets[hashCode % buckets.Length]; i >= 0; i = entries[i].next)
1) Se não entendi corretamente, 0x7FFFFFFF existe para garantir que não recebamos um valor negativo. Então, o que a primeira linha retorna? É um número inteiro simples ou um primo?
2) Na segunda linha, por que inicializamos i para buckets [hashCode% buckets.Length]?