Уникальное требование не является жестким, но чем уникальнее хэш-код, тем лучше.
Обратите внимание, что вначале хэш-код используется для HashMap в качестве индекса в «корзину». Следовательно, оптимально это должно быть уникально по модулю размера корзины, количества слотов в корзине. Однако это может измениться, когда карта увеличивается.
Но ладно, к оптимальному хеш-коду:
- Диапазоны важны; если x и y где в 0..255, то они могут быть уникально упакованы в два байта, или когда 0..999, то y * 1000 + x. Для LocalDateTime, если можно взять длинный в секундах (то есть мс или нс), и с 2012-01-01, вы можете принять диапазон от 0 до, скажем, двух лет в будущем.
Вы можете изучить существующие или создать достоверные данные испытаний. Затем можно математически оптимизировать функцию хеш-кода по их совпадающим коэффициентам (7, 13, 23). Это линейная оптимизация, но это также можно сделать простым методом проб и ошибок: подсчитать количество столкновений на переменную (A, B, C).
//int[] coeffients = ...;
int[][] coefficientsCandidates = new int[NUM_OF_CANDIDATES][NUM_OF_COEFFS];
...
int[] collisionCounts = new int[NUM_OF_CANDIDATES];
for (Data data : allTestData) {
... update collisionCounts for every candidate
}
... take the candidate with smallest collision count
... or sort by collisionCounts and pick other candidates to try out
Как правило, такой код оценки не требуется для работающего хеш-кода, но особенно он может обнаружить плохие хеш-коды, если существует какая-то псевдослучайность, идущая неправильно. Например, если коэффициент слишком велик для диапазона (день недели * 1000), то появляются дыры в значениях.
Но также нужно честно сказать, что все эти усилия, вероятно, действительно не нужны.