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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вопрос по hash 
V
    Опции темы
ziga
Дата 28.11.2015, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 1



Подскажите почему у 2х одинаковых массивов String разный хэш ?

Код

String[] k1 = {"a", "b"};
String[] k2 = {"a", "b"};
    
System.out.println("Hash k1: " + k1.hashCode()); // Hash k1: 1741555911
System.out.println("Hash k2: " + k2.hashCode()); // Hash k2: 128087567


по какому принципу вычисляется хэш для массивов? 
PM MAIL   Вверх
leniviy
Дата 29.11.2015, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 5



Вопросы такого характера решаются следующим образом: в IDE наводите курсор на метод hashCode, вызываете контекстное меню и выбираете "Open declaration"; смотрите имплементацию или javadoc.

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
Angel666
Дата 29.11.2015, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

Репутация: нет
Всего: 1



Ты получаешь хашкод конкретного объекта и как понимаешь для разных объектов он будет разный (массив k1 не равен k2 это разные объекты). А я понимаю тебе надо тут вычислять не хашкод объекта а его значения.

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
ziga
Дата 30.11.2015, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 1



Цитата(leniviy @  29.11.2015,  11:21 Найти цитируемый пост)
вызываете контекстное меню и выбираете "Open declaration"


Кидает в Object на

Код

public native int hashCode();


С++ не владею по этому не могу понять почему именно в массивах хэш разный.

Цитата(Angel666 @  29.11.2015,  13:07 Найти цитируемый пост)
Ты получаешь хашкод конкретного объекта и как понимаешь для разных объектов он будет разный


Тогда в таком случае для примера:

Код

String s1 = new String("s1");
String s2 = new String("s1");
        
System.out.println("Hash s1: " + s1.hashCode()); // Hash k1: 3614
System.out.println("Hash s2: " + s2.hashCode()); // Hash k2: 3614


хэши тоже должны быть разные, но они одинаковые потому что у String'а хэш вычисляется из значения.
PM MAIL   Вверх
Romikgy
Дата 30.11.2015, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: нет
Всего: 146



Цитата(ziga @  30.11.2015,  09:43 Найти цитируемый пост)
С++ не владею по этому не могу понять почему именно в массивах хэш разный.

кинь сюда поможем разобраться 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

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


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



У массивов хешкод это просто некое случайное число, не зависящее от содержимого массива. Массивы разные - хэшкод разный. Если нужен хэшкод зависящий от содержимого, надо использовать Arrays.hashCode().


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
ziga
Дата 30.11.2015, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 1



Цитата(Romikgy @  30.11.2015,  10:56 Найти цитируемый пост)
кинь сюда поможем разобраться  

http://hg.openjdk.java.net/jdk7/jdk7/hotsp...ynchronizer.cpp процедура 

Код

static inline intptr_t get_next_hash(Thread * Self, oop obj) {
  intptr_t value = 0 ;
  if (hashCode == 0) {
     // This form uses an unguarded global Park-Miller RNG,
     // so it's possible for two threads to race and generate the same RNG.
     // On MP system we'll have lots of RW access to a global, so the
     // mechanism induces lots of coherency traffic.
     value = os::random() ;
  } else
  if (hashCode == 1) {
     // This variation has the property of being stable (idempotent)
     // between STW operations.  This can be useful in some of the 1-0
     // synchronization schemes.
     intptr_t addrBits = intptr_t(obj) >> 3 ;
     value = addrBits ^ (addrBits >> 5) ^ GVars.stwRandom ;
  } else
  if (hashCode == 2) {
     value = 1 ;            // for sensitivity testing
  } else
  if (hashCode == 3) {
     value = ++GVars.hcSequence ;
  } else
  if (hashCode == 4) {
     value = intptr_t(obj) ;
  } else {
     // Marsaglia's xor-shift scheme with thread-specific state
     // This is probably the best overall implementation -- we'll
     // likely make this the default in future releases.
     unsigned t = Self->_hashStateX ;
     t ^= (t << 11) ;
     Self->_hashStateX = Self->_hashStateY ;
     Self->_hashStateY = Self->_hashStateZ ;
     Self->_hashStateZ = Self->_hashStateW ;
     unsigned v = Self->_hashStateW ;
     v = (v ^ (v >> 19)) ^ (t ^ (t >> 8)) ;
     Self->_hashStateW = v ;
     value = v ;
  }

  value &= markOopDesc::hash_mask;
  if (value == 0) value = 0xBAD ;
  assert (value != markOopDesc::no_hash, "invariant") ;
  TEVENT (hashCode: GENERATE) ;
  return value;
}


Цитата(LSD @  30.11.2015,  11:04 Найти цитируемый пост)
У массивов хешкод это просто некое случайное число, не зависящее от содержимого массива. 
 
- в принципе этот ответ меня устраивает

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

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

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


 




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


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

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