Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Основы. Object.hashCode(), расскажите смысл и правила пож. 
:(
    Опции темы
Domestic Cat
Дата 16.5.2005, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Цитата(AntonSaburov @ 16.5.2005, 10:17)
Эти будут иметь один.


Точно. Я имел в виду - для объектов, у которых хешкод() не переопределен.


--------------------

PM   Вверх
AntonSaburov
Дата 16.5.2005, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



Цитата(Domestic @ 16.5.2005, 19:23)
Я имел в виду - для объектов, у которых хешкод() не переопределен.

Убедил smile
PM MAIL WWW ICQ   Вверх
Sleepy_PIP
Дата 16.5.2005, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 512
Регистрация: 30.6.2004
Где: Moscow

Репутация: 4
Всего: 12



вообще в теории БД - хеш ключ однозначно определяет местоположение записи. посему она (запись) может быть очень быстро получена.
Мне не понятно - зачем иметь повторяющиеся хеш-коды, и тем более такие по которым нельзя восстановить положение объекта для доступа к оному.


--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
Domestic Cat
Дата 16.5.2005, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Дык определять хешкод должен ты сам если намереваешься использовать объект в качестве ключа. Для стандартных классов типа Стринг, Интегер, итп они определены. Просто делать такой хеш который бы давал 100% гарантию не всегда нужно - достаточно чтобы хеши как можно реже совпадали. Например, для стринга используется полином. Иначе ты конечно выиграешь на времени поиска немного, но проиграешь на вычислении самого хеша.


--------------------

PM   Вверх
Sleepy_PIP
Дата 16.5.2005, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 512
Регистрация: 30.6.2004
Где: Moscow

Репутация: 4
Всего: 12



Цитата(Domestic @ 16.5.2005, 21:10)
Дык определять хешкод должен ты сам если намереваешься использовать объект в качестве ключа. Для стандартных классов типа Стринг, Интегер, итп они определены. Просто делать такой хеш который бы давал 100% гарантию не всегда нужно - достаточно чтобы хеши как можно реже совпадали. Например, для стринга используется полином. Иначе ты конечно выиграешь на времени поиска немного, но проиграешь на вычислении самого хеша.

таки. для моего понимания - у кого хеш-коды определены? ... String. а еще. - где можно получить однозначную информацию? Для оболочек?
таки не понятно - полином, не полином - но в хеш таблице если я кладу String и хочу максимально эффекта от поиска - переопределять самому?. а для кого еще переопределять самому? ... плаваю я тут smile
т.е. грубо - для любых хеш-таблиц достаточно иметь хеш-код равный индексу? но это-ж не верно! - 2 одинаковых объекта тогда будут имет разный хеш код ... а вообще как посмотрерть - их-же щзанесли в таблицу намерянно! - значить они должны хоть чем-то отличаться ... а?

Это сообщение отредактировал(а) Sleepy_PIP - 16.5.2005, 21:46


--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
Domestic Cat
Дата 16.5.2005, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Цитата(Sleepy_PIP @ 16.5.2005, 12:42)
но в хеш таблице если я кладу String и хочу максимально эффекта от поиска - переопределять самому?. а для кого еще переопределять самому?

Зачем же? Посмотри доки для Стринга, там формула есть как хеш его вычисляется.
http://java.sun.com/j2se/1.4.2/docs/api/ja...html#hashCode()
По-моему этого достаточно для 99% случаев. Ну и остальные классы - смотришь в доки, есть ли хешкод.


--------------------

PM   Вверх
Sleepy_PIP
Дата 16.5.2005, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 512
Регистрация: 30.6.2004
Где: Moscow

Репутация: 4
Всего: 12



Цитата(Domestic @ 16.5.2005, 21:49)
Цитата(Sleepy_PIP @ 16.5.2005, )
но в хеш таблице если я кладу String и хочу максимально эффекта от поиска - переопределять самому?. а для кого еще переопределять самому?

Зачем же? Посмотри доки для Стринга, там формула есть как хеш его вычисляется.
http://java.sun.com/j2se/1.4.2/docs/api/ja...html#hashCode()
По-моему этого достаточно для 99% случаев. Ну и остальные классы - смотришь в доки, есть ли хешкод.

угу. что-то проясняется. но для собственных классов - всегда писать свое? ... или есть что-то универсальное?
int для хеш-кода- очень мало smile

Это сообщение отредактировал(а) Sleepy_PIP - 16.5.2005, 21:56


--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
Domestic Cat
Дата 16.5.2005, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



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


--------------------

PM   Вверх
Sleepy_PIP
Дата 17.5.2005, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 512
Регистрация: 30.6.2004
Где: Moscow

Репутация: 4
Всего: 12



Цитата(Domestic @ 16.5.2005, 22:00)
Да, писать свое. Но ничего сложного особо не должно быть. Например, если каждый объект имеет уникальное поле типа Стринг, можно просто возвращать хеш этого стринга.
Хотя часто ли ты пользуешь объекты своего класса как ключи?

да вообщем-то нет конечно. в объекте всегда держу именно уникальный ключ - проперти ...


--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
AntonSaburov
Дата 17.5.2005, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



Цитата(Sleepy_PIP @ 16.5.2005, 21:51)
int для хеш-кода- очень мало

Этого за глаза должно хватать. Если у тебя хэш - это адрес объекта в памяти, то уникальность его практически гарантирована. А использование одного хэш для целых и строк - нормальный ход - не надо хранить ссылки на все ключи. Создаешь такой же объект и ключ у тебя в кармане.
PM MAIL WWW ICQ   Вверх
chief39
Дата 25.5.2005, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 15
Всего: 77



Цитата(Sleepy_PIP @ 16.5.2005, 21:03)
вообще в теории БД - хеш ключ однозначно определяет местоположение записи. посему она (запись) может быть очень быстро получена.
Мне не понятно - зачем иметь повторяющиеся хеш-коды, и тем более такие по которым нельзя восстановить положение объекта для доступа к оному.



Скорее не так... для этого у нас есть уникальные индексы(чтобы уникально определить запись)
А хэш ключ служит для ускорения поиска. И он по определению не уникален!!!
Но он даёт возможность быстро сузить круг поисков.
Например - у нас есть числа от 0 до 99(выступают в роли значений уникального ключа для каких-то данных). Хэш код - это результат деления этих чисел без остатка на 10. Имеем 1,2,3 .....
Когда нам надо найти позицию числа 56 мы берём его хеш код - 5.
и ищем там где хеш код 5: (50,51,52,53,54,55,56,57,58,59)
а вот среди них уже ищем нужное число последовательным перебором и сравнением с "56".
применительно к Хэштейблам и проч. он тоже не может быть уникален по определению: как вы представляете впихнуть множество возможных состояний объекта и множество возможных классов в int?
тогда бы все объекты можно было бы хранить как int.
А потом хитроумно декодировать при использовании.
Можно только использовать этот int как первичный ключ в БД. Но тогда этот механизм должен поддерживать контейнер: хэшмэп и т.д.
на самом деле механизм формирования кода реализован-то в самих объектах, ага? smile
Суть в том, что когда у нас есть 1000 объектов - мы по хэшкоду находим 12 которые с ним совпадают а их уже "ПЕРЕТРАХИВАЕМ" ( smile ) сравнивая полностью объекты. Но ведь 12 - это вам 1000 smile
Тут сразу хэшкод зауважаешь smile

Как говорил многоуважаемый Винни-Пух: "Это Ж-Ж-Ж неспроста!!!" smile




--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
chief39
Дата 25.5.2005, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 15
Всего: 77



Вот так звучит первоначальный вопрос:
[quote=Sleepy_PIP, 13.5.2005, 10:48]Вот, решил что хватит по верхушкам бродить. Не стыжусь спросить.
Копнул, и выяснилось что я до конца не понимаю смысла хеш-кода у Object и правила его формиро%
Добавлено @ 21:11
[quote=Sleepy_PIP, 16.5.2005, 21:03]вообще в теории БД - хеш ключ однозначно определяет местоположение записи. посему она (запись) может быть очень быстро получена.
Мне не понятно - зачем иметь повторяющиеся хеш-коды, и тем более %F
PM MAIL   Вверх
chief39
Дата 25.5.2005, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 15
Всего: 77



пардон за предыдущий пост, глюк однако (у меня)
Вот так звучит первоначальный вопрос:
Цитата
Копнул, и выяснилось что я до конца не понимаю смысла хеш-кода у Object и правила его формирования.

по поводу формирования - есть свойство hash у объектов которое я так понимаю инициализируется с учётом пресловутого адреса в памяти
и метод hashcode() который формирует хэшкод объекта с учётом hash
Например у стринга:
Код

    public int hashCode() {
    int h = hash;
    if (h == 0) {
        int off = offset;
        char val[] = value;
        int len = count;

            for (int i = 0; i < len; i++) {
                h = 31*h + val[off++];
            }
            hash = h;
        }
        return h;
    }


А зачем? А чтоб быстрее искало в хэшмапе и т.п.
у хешмапы есть:
Код


public V get(Object key) {
        Object k = maskNull(key);  
        int hash = hash(k);         // вычисляет хэш используя значение, которое
// вернул hashCode()  объекта k - то есть у мапы уже свой хэшкод для объекта
// кстати в примере hatsumeika вылетало напрочь из человеческой логики 
// вот тут. hashcode() нет - хэшкода нет - нет и диапазона - позже получим null
        int i = indexFor(hash, table.length); // а тут как бы берём диапазон объектов
// что-то вроде сортировки с использования хэшкода - то есть все объекты с таким 
// хешкодом в любом случае в него попадут
        Entry<K,V> e = table[i]; // получаем осязаемый диапазон на руки  :) 
        while (true) { // и понеслась
            if (e == null)    // вот тут в примере и вылетело
                return null;%


Это сообщение отредактировал(а) Domestic Cat - 26.5.2005, 09:26


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
chief39
Дата 26.5.2005, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 15
Всего: 77



Код

(прямое продолжение предыдущего поста - не влезло чёт  :(  )
            if (e.hash == hash && eq(k, e.key)) // а вот ради этого хэшкод и ввели
// оно проверяет хэшкоды - если не подходит - то объект не сравнивает
// кстати, я в своём примере сбрехал (12 из 1000) - оно не будет все двенадцать
//  объектов выбирать - просто только у 12 объектов есть шанс что их полностью 
// сверят - поскольку они по коду подходят - остальные отвалятся на первом 
// условии.
                return e.value;   // 
            e = e.next;
        }
    }



а совпасть хэшкоды могут

так же как значения random()
просто случайно совпасть...
ну да не беда smile
они своё дело сделают и так

прошу развить тему smile

Это сообщение отредактировал(а) Domestic Cat - 26.5.2005, 09:26


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1930 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.