Пустые и пустые коллекции в GetHashCode - PullRequest
0 голосов
/ 12 июня 2019

В реализации GetHashCode ниже, когда Collection равно null или пусто, оба результата приведут к хеш-коду 0.

Коллега предложил вернуть случайное жестко закодированное число, например 19, чтобы отличить его от коллекции null.Зачем мне это делать?Почему меня волнует, что null или пустая коллекция производит другой хэш-код?

public class Foo
{
    public List<int> Collection { get; set; }
    // Other properties omitted.

    public int override GetHashCode()
    {
        var hashCode = 0;
        if (this.Collection != null)
        {
            foreach (var item in this.Collection)
            {
                var itemHashCode = item == null ? 0 : item.GetHashCode();
                hashCode = ((hashCode << 5) + hashCode) ^ itemHashCode;
            }
        }

        return hashCode;
    }
}

1 Ответ

2 голосов
/ 12 июня 2019

Конструкция GetHashCode заключается в том, что предполагается свести к минимуму количество столкновений, которые будут иметь место, насколько это возможно. Несмотря на то, что некоторые коллизии хэшей неизбежны, вам нужно помнить о том, какие типы объектов сталкиваются, какие типы данных будут храниться в ваших коллекциях на основе хешей, и работать над тем, чтобы эти типы объектов, хранящихся вместе в одной коллекции, с меньшей вероятностью столкнутся.

Так что, если вам случится что-то узнать о том, как будут использоваться коллекции этого типа на основе хэшей, и что в них могут быть как нулевые, так и пустые объекты, то это повысило бы производительность, если бы их не было. сталкиваются. Если вы подозреваете, что наличие как нулевого, так и пустого значения в одной и той же коллекции маловероятно, то столкновение их на самом деле не является проблемой.

...