powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос hashCode
10 сообщений из 10, страница 1 из 1
Вопрос hashCode
    #38704900
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объясните, пожалуйста зачем в классе используется этот дикий генератор hashCode:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
.........
    @Column(name = "latitude")
    private double latitude;

    @Column(name = "longitude")
    private double longitude;

    public Location() {
    }
.....
@Override
    public int hashCode() {
        int result;
        long temp;
        temp = Double.doubleToLongBits(latitude);
        result = (int) (temp ^ (temp >>> 32));
        temp = Double.doubleToLongBits(longitude);
        result = 31 * result + (int) (temp ^ (temp >>> 32));
        return result;
    }


Спасибо
...
Рейтинг: 0 / 0
Вопрос hashCode
    #38704910
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,

Не понял вопроса. Зачем вообще, или почему такой дикий?
Вот это уже прочитано и осознано?
http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#hashCode()
...
Рейтинг: 0 / 0
Вопрос hashCode
    #38704926
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczJulT,

Не понял вопроса. Зачем вообще, или почему такой дикий?
Вот это уже прочитано и осознано?
http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#hashCode()
Нет, то, что он необходим это понятно, а вот почему такой сложный. В других классах, например, генерация хэша намного проще
...
Рейтинг: 0 / 0
Вопрос hashCode
    #38704933
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTНет, то, что он необходим это понятно, а вот почему такой сложный. В других классах, например, генерация хэша намного проще
Не потому ли что Double это тип с плавающей точкой, а hashCode - целое число. Поэтому для вычисления hashCode Double значение просто преобразуют в целочисленной на основе бит (чтобы вся информация сохранилась)
...
Рейтинг: 0 / 0
Вопрос hashCode
    #38704937
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczJulTНет, то, что он необходим это понятно, а вот почему такой сложный. В других классах, например, генерация хэша намного проще
Не потому ли что Double это тип с плавающей точкой, а hashCode - целое число. Поэтому для вычисления hashCode Double значение просто преобразуют в целочисленной на основе бит (чтобы вся информация сохранилась)
Точно, спасибо.
...
Рейтинг: 0 / 0
Вопрос hashCode
    #38704988
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И все таки не понятно зачем это делать, если у меня объявлено уникальное поле айди для этого класса, по нему и можно было бы сформировать хэш значение:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
@Entity
@Table(name = "driver_location")
public class DriverLocation {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @ManyToOne(optional = false)
    private Driver driver;

    @ManyToOne
    private Mission mission;

    @Embedded
    private Location location;


Или вся проблема в том, что айди в данном случае Long id, а не интежер?
...
Рейтинг: 0 / 0
Вопрос hashCode
    #38704996
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,

Мы же не знаем какой у вас ID у Location. По-хорошему для ORM стоит использовать ID. Это верно.
...
Рейтинг: 0 / 0
Вопрос hashCode
    #38705014
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ID тут никак не годится, тем более IDENTITY.
Дело в том, что функция hashCode() должна согласовываться с equals(). То есть там, где объекты эквивалентны, хеш должен совпадать.
Теперь смотрим на описание класса - судя по всему, он хранит координаты, и совершенно логично предположить, что координаты с одинаковой широтой и долготой тут будут эквивалентны. Следовательно, и хеш в этом случае должен совпадать. Если при вычислении хеш-кода использовать что-то другое, кроме широты и долготы, совпадение нельзя гарантировать.
...
Рейтинг: 0 / 0
Вопрос hashCode
    #38705087
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо Blazkowicz, ivanra
...
Рейтинг: 0 / 0
Вопрос hashCode
    #38705110
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTBlazkowiczJulT,

Не понял вопроса. Зачем вообще, или почему такой дикий?
Вот это уже прочитано и осознано?
http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#hashCode()
Нет, то, что он необходим это понятно, а вот почему такой сложный. В других классах, например, генерация хэша намного проще
Мы могли-бы сделать следующую хеш-функцию.
Код: java
1.
2.
3.
public int hashCode() {
        return  (int)Double.doubleToLongBits(longitude)^(int)Double.doubleToLongBits(latitude);
}


И она бы работала.

Но проблема в том что она не будет идеальной с точки зрения хеша. Дело в том что гео-координаты
на карте имеют скопления или "кластеры". Это точки сосредоточенные очень близко друг от друга.
В хеше они дадут нелинейную гистограмму значений на выходе вследствие чего хеш-тах блица
перестанет быть хешем и может выродиться в набор нескольких массивов (buckets)
с "тормозным" поиском.

Создатель этого класса знал об этом факте и позаботился о дополнительных
процедурах улучшающих гистограмму.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос hashCode
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]