2016-04-19 9 views
0

int64とboolを持つstruct型とint64とbool型のフィールドが多い埋め込み型があります。データが変更されているかどうかを判断するためのカスタムハッシュコードの作成方法

type T1 struct { 
    f1 int64 
    f2 int64 
    f3 bool 
    T2 T2 
} 

type T2 struct { 
    f4 int64 
    f5 int64 
    f6 bool 
} 

ここで、すべての構造体フィールド/プロパティを使用して、ハッシュコードを生成します。

これの目的は、インスタンスの内容が変更されたかどうかを判断することができますが、前後のハッシュコード値を比較することです。

したがって、T1インスタンスが変更された場合、つまりそのプロパティのいずれかが変更された場合、ハッシュの値は異なるはずです。

+1

型がマップキーに対して有効な場合は、 'map [T1] bool'で型の存在を確認できますが、その場合は' == '演算子を使うこともできます。さもなければ、あなたの型のための何らかの並べ替え方法を定義しなければならないでしょう。 – JimB

+1

@JimBをエコーオフするには、encoding/gob&base64を使用して構造体をシリアライズします。 –

+0

私はそれをシリアル化したくない、私はフィールドの値に基づいているハッシュ値が欲しい。 –

答えて

0

あなたはのようなものを使用することができます。あなたがマップキーとしてそれを使用している場合、それだけで直接キーとして構造体を使用して、それを扱う手放す方が良いですが

func (t *T1) Hash() uint64 { 
    hb := make([]byte, 8+8+1+8+8+1) 
    binary.BigEndian.PutUint64(hb, uint64(t.f1)) 
    binary.BigEndian.PutUint64(hb[8:], uint64(t.f2)) 
    if t.f3 { 
     hb[16] = 1 
    } 
    binary.BigEndian.PutUint64(hb[17:], uint64(t.T2.f4)) 
    binary.BigEndian.PutUint64(hb[25:], uint64(t.T2.f5)) 
    if t.T2.f6 { 
     hb[33] = 1 
    } 
    f := fnv.New64a() 
    f.Write(hb) 
    return f.Sum64() 
} 

playground

関連する問題