SORU
31 EKİM 2008, Cuma


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
31 EKİM 2008, Cuma


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Andrey Menshikov

    Andrey Mensh

    28 Ocak 2012
  • FrankJavCee

    FrankJavCee

    29 Kasım 2008
  • gamingbits

    gamingbits

    2 Mayıs 2006