2015-04-07 4 views
1

Этот вопрос касается селектора isEqual в objc.О isEqual и hash

Я знаю, когда использование объекта isEqual, они сравнили hash, но как понять код последующего:

NSString *string = [NSString stringWithFormat:@"%d", 1]; 
NSLog(@"%d", [@"1" hash] == [string hash]); // output 1 

Я прочитал хэш объекта не может быть таким же, почему выход 1?

ответ

3

Я знаю, когда объект используют isEqual, они сравнили hash

Это не правильно. isEqual сравнивает объект без использования hash (обычно).

Я прочитал хэш объекта не может быть такой же

Также не правильно, хэш должны быть одинаковыми для одинаковых объектов и может быть одинаковой для в равных объектах. Поскольку хэш является int, существует только 2^32 возможных значения, недостаточно для того, чтобы он был уникальным для каждого возможного объекта (если только этот объект не эквивалентен самому 32 битам или меньше).

Единственное правило о hash: если [a isEqual:b] верно, то это должно быть правдой: [a hash] == [b hash].

Так как ваши две строки равны, как "1", то следует, что хеши также должны быть равны.

+0

Существует вопрос о причинности между 'isEqual' и' hash'. Действительно ли 'isEqual' делает' hash' равным? Или, причина 'hash' равно равна' isEqual'? – saitjr

+0

isEqual true означает hash true. Только. – weston

+0

, но адрес памяти '@" 1 "и' string' не одинаковый, мы не можем сказать, что объект тот же, почему 'isEqual' дает мне такой же результат? – saitjr

Смежные вопросы