Как реализован GetHashCode () F # записи? - PullRequest
0 голосов
/ 26 ноября 2018

Я изо всех сил пытаюсь найти его на https://github.com/fsharp/fsharp

, и это очень важно, потому что мне нужно обеспечить как можно меньше коллизий.

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

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

  1. Начать с начального значения 0.
  2. Затем для каждого элемента в поле, начиная с последнего определенного (т.е. с учетом типа записи {a: int; b: string} мы начинаем с b), выполните следующее:

    0x9e3779b9 + fields.[i].GetHashCode() + (value <<< 6) + (value >>> 2), где value - это значение изпредыдущая итерация алгоритма.Мы предполагаем, что fields.[i] не равно нулю, в противном случае его значение хэш-функции просто установлено на 0.

  3. Повторите шаг 2 для всех полей.

Это можно увидеть висходный код из mkRecdHashWithComparer и mkAddToHashAcc .

Для простой записи примера {a: int; b: string} декомпилированный метод GetHashCode выглядит так:

[CompilerGenerated]
public sealed override int GetHashCode(IEqualityComparer comp)
{
    if (this != null)
    {
        int num = 0;
        num = -1640531527 + ((b@?.GetHashCode() ?? 0) + ((num << 6) + (num >> 2)));
        return -1640531527 + (a@ + ((num << 6) + (num >> 2)));
    }
    return 0;
}
0 голосов
/ 26 ноября 2018

Ну, я могу вам сказать, что это не приведет к наименьшему количеству возможных столкновений.Вы можете переопределить GetHashCode.Некоторые жаловались, что это не соответствует их потребностям в хешировании, но что для обратной совместимости это не может быть разумно изменено.Я бы добавил проблему в репозиторий github visual fsharp, если это серьезная проблема для вас из-за проблем производительности при проверке конфликтующих хешей.Issues / 366 github.com / fsharp / fsharp / Issues / 343 github.com / Microsoft / visualfsharp / Issues / 1838

...