Giả sử tôi có một đối tượng được gọi là Person
có thuộc tính socialSecurityNumber
và lớp này ghi đè phương thức isEqual:
để trả về true khi thuộc tính số an sinh xã hội bằng nhau. Và nói rằng tôi đã đặt một loạt các trường hợp của Person
vào một NSDictionary
.ObjectForKey của NSDictionary có dựa vào danh tính hoặc bình đẳng không?
Nếu bây giờ tôi tạo một đối tượng newPerson
đó xảy ra để có số an sinh xã hội giống như một đã có trong từ điển, và tôi làm [myDictionary objectForKey:newPerson]
, nó sẽ sử dụng các isEqual:
và return YES, hoặc nó sẽ so sánh con trỏ và trở về KHÔNG?
Tôi biết tôi có thể viết một bài kiểm tra đơn giản để tìm hiểu, nhưng tôi muốn hiểu chính xác cách objectForKey:
tìm thấy kết quả phù hợp trong từ điển và nói chung là mức độ nhất quán giữa ca cao (ví dụ: indexofObject:
?)
Làm cách nào để triển khai băm? –
Như bạn muốn miễn là 2 objets bằng nhau có cùng một băm, và rằng băm không quá phức tạp để tính toán. Thuật toán được sử dụng cho điều đó tùy thuộc vào bạn, nhưng hai đối tượng có giá trị băm khác nhau sẽ luôn được xem là khác nhau và hai objets có cùng giá trị băm sẽ được coi là có khả năng bằng nhau và sẽ gọi 'isEqual:' để đảm bảo chúng thực sự là bình đẳng. Điều này cho phép so sánh rất nhanh và tra cứu từ điển bằng cách chỉ so sánh giá trị băm (chỉ là số nguyên) và chỉ tham gia vào so sánh thực với 'isEqual:' khi băm là bằng nhau. – AliSoftware
Ví dụ, đối với một chuỗi, ta có thể thực hiện phương thức 'hash' bằng cách trả về độ dài của chuỗi. Hai chuỗi bằng nhau sẽ có cùng một băm và 2 chuỗi khác nhau sẽ có các giá trị băm khác nhau. Một số chuỗi khác (như '@" bar "' và '@" baz "') sẽ vẫn có cùng giá trị băm, nhưng đó không phải là một vấn đề, trong trường hợp đó 'isEqual:' sau đó sẽ tạo một ký tự phân tích sâu hơn để kiểm tra sự bình đẳng. Nhưng so sánh này (tốn nhiều thời gian hơn) sẽ chỉ được thực hiện để so sánh các chuỗi có cùng độ dài: chuỗi có độ dài khác nhau sẽ trả về 'NO' nhanh hơn. – AliSoftware