Hibernate: стратегия / шаблон для сопоставления идентификаторов объектов и сущностей с использованием составных ключей? - PullRequest
0 голосов
/ 23 июля 2010

Каков общий наилучший метод Java для предотвращения столкновений при генерации хеш-кодов для многоколоночных первичных ключей любого типа (атомарных типов)?

Я думал об этом в течение нескольких часов и пришел к выводу, что единственный надежный способ сделать это - строка, объединенная всеми столбцами первичного ключа. Затем вызов метода Java hashCode для этой объединенной строки должен привести к уникальному целому числу. (это фактически каким-то образом имитирует то, что делает индекс базы данных, хотя и не уверен здесь)

Для первичного ключа из нескольких столбцов в форме

CREATE TABLE PlayerStats
(
    game_id INTEGER,
    is_home BOOLEAN,
    player_id SMALLINT,
    roster_id SMALLINT,
    ... -- (game_id, is_home) FK to score, (player_id, roster_id) FK to team member
    PRIMARY KEY (game_id, is_home, player_id, roster_id)
)

хеш-код может быть вычислен как:

@Override
public int hashCode()
{
    //                                                                 maxchars:
    String surrogate =   String.format("%011d", this.gameId)         //11
                       + String.format("%01d" , this.isHome ? 1 : 0) //1
                       + String.format("%011d", this.playerId)       //6
                       + String.format("%011d", this.rosterId)       //6

    System.out.println("surrogate = '" + surrogate + "'");

    return surrogate.hashCode();
}

Конечно, это работает только с HashSets и Hashtable, когда равно равно также и на этом.

Мой вопрос: это хорошая общая стратегия?

Я вижу, что вычисления на лету могут быть не самыми быстрыми. Возможно, вы захотите пересчитать хеш-код всякий раз, когда значение составного ключа было изменено (например, вызовите метод rehash () из каждого установщика, работающего со свойством ключа.

Предложения и улучшения приветствуются. Нет ли общеизвестных стратегий для этого? Узор?

1 Ответ

0 голосов
/ 24 июля 2010

Хеш-код используется в качестве индекса для поиска элементов в наборе данных, имеющих одинаковый код.Затем метод equals используется для поиска совпадений в наборе элементов с одинаковым хеш-кодом.Таким образом, сгенерированный хеш-код не должен быть на 100% уникальным.Он просто должен быть «достаточно уникальным», чтобы создать приличное распределение среди элементов данных, чтобы не было необходимости вызывать метод equals для большого числа элементов с одинаковым значением hashCode.

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

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

...