Geçersiz kılma ısequal en iyi uygulamaları ve karma
Nasıl düzgün Objective-C isEqual:
geçersiz kılar mı? "Catch" eğer iki nesne eşit isEqual:
yöntemi ile belirlendiği gibi), aynı karma değere sahip olmalılar.
Cocoa Fundamentals Guide Introspection bölümüne bir sınıf MyWidget
adlı isEqual:
, şu şekilde kopyalanamaz, geçersiz kılmak için nasıl bir örnek var:
- (BOOL)isEqual:(id)other {
if (other == self)
return YES;
if (!other || ![other isKindOfClass:[self class]])
return NO;
return [self isEqualToWidget:other];
}
- (BOOL)isEqualToWidget:(MyWidget *)aWidget {
if (self == aWidget)
return YES;
if (![(id)[self name] isEqual:[aWidget name]])
return NO;
if (![[self data] isEqualToData:[aWidget data]])
return NO;
return YES;
}
İşaretçi eşitlik, sınıf eşitliği, denetler ve son olarak nesneleri sadece name
data
özelliklerini kontrol eden isEqualToWidget:
kullanarak karşılaştırır. Ne örnekyokhash
geçersiz kılmak için nasıl göster.
Hadi eşitlik etkileyen diğer özellikleri vardır varsayalım, ki age
. hash
Bu yöntem geçersiz name
data
sadece karma etkileyen böyle olması gerekmez mi? Ve eğer öyleyse, bunu nasıl yapacaksın? Sadece name
data
sağlamalarının Ekle? Örneğin:
- (NSUInteger)hash {
NSUInteger hash = 0;
hash = [[self name] hash];
hash = [[self data] hash];
return hash;
}
Bu kadarı yeterli mi? Daha iyi bir yöntem var mı? Eğer ilkel, int
gibi. NSNumber
onları kendi karma almak için dönüştürün. Ya NSRect
gibi yapılar?
(İçine sıçtık: Aslen "YA da" onları |=
. ile birlikte bit yazdı Eklemek anlamına geliyordu.)
CEVAP
Başlayın
NSUInteger prime = 31;
NSUInteger result = 1;
Her ilkel için yapıyorsun
result = prime * result var
64 bit için de shift ve xor isteyebilirsiniz.
result = prime * result (int) (var ^ (var >>> 32));
Nesneler için nil için 0 kullanın ve hashcode yoksa.
result = prime * result [var hash];
Boolean değerleri için iki farklı değerler kullanın
result = prime * result (var)?1231:1237;
Açıklama ve Atıf
Bu tcurdt iş değildir, ve yorumlar atıf için düzenleme adil olduğunu düşünüyorum bu yüzden daha fazla açıklama için soruyorum.
Bu algoritma kitapta popüler oldu "Java" ve the relevant chapter can currently be found online here. Etkili Bu kitap, Java uygulamaları bir dizi (güneş Tutulması da dahil olmak üzere) varsayılan algoritma, popüler. Ancak, değişik Dan Bernstein ya da Chris Torek atfedilen hatta eski bir uygulama dan türetilmiş. Eski algoritma aslında etrafında Usenet üzerinde süzülüyor, ve bazı atıf zordur. Örneğin, başvuran interesting commentary in this Apache code (isimlerini aramak) bazı orijinal kaynak var.
Sonuç olarak, bu çok eski, basit bir karma algoritmasıdır. En ölçülebilir değildir, ve hatta matematiksel bir algoritma. iyi olduğu kanıtlanmış değildir Ama bu basit, ve bir sürü insan iyi sonuçlar ile uzun süre kullanmış, tarihi çok destek var.
Geçersiz kılma yöntemleri kategoriler ...
Geçersiz kılma ASP.NET Öznitelik Yetki...
jQuery geçersiz kılma varsayılan doğru...
Geçersiz kılma otomatik bir özellik...
Django: uygulama şablonu Geçersiz kılm...