2013-09-25 3 views
1

В приведенном ниже коде мне было интересно, почему XOR (^) используется для комбинирования идентификаторов составных элементов композиции (это источник от MonoCross 1.3)?XOR для идентификации объекта

  1. ли побитовое исключающее ИЛИ MXViewPerspective объекта Perspective и ModelType элемент используется для уникальной идентификации экземпляра?

  2. Если да, то есть ли имя для этого свойства операции XOR (как XOR-ing два значения (то есть, хэш-коды) гарантирует уникальность)?


public class MXViewPerspective : IComparable 
{ 
    public MXViewPerspective(Type modelType, string perspective) 
    { 
     this.Perspective = perspective; 
     this.ModelType = modelType; 
    } 
    public string Perspective { get; set; } 
    public Type ModelType { get; set; } 

    public int CompareTo(object obj) 
    { 
     MXViewPerspective p =(MXViewPerspective)obj; 
     return this.GetHashCode() == p.GetHashCode() ? 0 : -1; 
    } 
    public static bool operator ==(MXViewPerspective a, MXViewPerspective b) 
    { 
     return a.CompareTo(b) == 0; 
    } 
    public static bool operator !=(MXViewPerspective a, MXViewPerspective b) 
    { 
     return a.CompareTo(b) != 0; 
    } 
    public override bool Equals(object obj) 
    { 
     return this == (MXViewPerspective)obj; 
    } 
    public override int GetHashCode() 
    { 
     return this.ModelType.GetHashCode()^this.Perspective.GetHashCode(); 
    } 

    public override string ToString() 
    { 
     return string.Format("Model \"{0}\" with perspective \"{1}\"", ModelType, Perspective); 
    } 
} 

Спасибо.

ответ

3

xor'ing hashcodes не гарантирует уникальность, но обычно используется для улучшения распределения по таблице, не усложняя хеширование.

Вы хотите сделать 2 разных значения для разных хеш-ключей, если они отличаются в любом из полей (т. Е. - то же самое ModelType, но разные Perspective, или наоборот). Поэтому вам нужно включить оба значения в хэш-ключ. Например, вы могли бы использовать + или сместить и соединить их (последнее было бы лучше, поскольку : гарантирует уникальность, но также увеличивает длину ключа, что может усложнить хэширование).

xor не гарантирует эту уникальность, так как если вы перевернете тот же бит в ModelType и Perspective, вы получите тот же ключ хэша, например 5^7 = 1^3 = 2, но это обычно достаточно хорошо. В конечном счете все зависит от диапазонов и распределений значений, которые вы предоставляете.

+0

Большое спасибо за отличный ответ! ... Что это в вашем профиле pic, его любопытное страшно! – samosaris

+0

Изменено 5 секунд назад :) - http://www.mnn.com/earth-matters/animals/photos/13-of-the-ugliest-animals-on-the-planet/blobfish – Leeor

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