code: func (p *PhysicalProperty) HashCode() []byte {
  	if p.hashcode != nil {
  		return p.hashcode
  	}
  	hashcodeSize := 8 + 8 + 8 + (16+8)*len(p.Items) + 8
  	p.hashcode = make([]byte, 0, hashcodeSize)
  	if p.Enforced {
  		p.hashcode = codec.EncodeInt(p.hashcode, 1)
  	} else {
  		p.hashcode = codec.EncodeInt(p.hashcode, 0)
  	}
  	p.hashcode = codec.EncodeInt(p.hashcode, int64(p.TaskTp))
  	p.hashcode = codec.EncodeFloat(p.hashcode, p.ExpectedCnt)
  	for _, item := range p.Items {
  		p.hashcode = append(p.hashcode, item.Col.HashCode(nil)...)
  		if item.Desc {
  			p.hashcode = codec.EncodeInt(p.hashcode, 1)
  		} else {
  			p.hashcode = codec.EncodeInt(p.hashcode, 0)
  		}
  	}
  	return p.hashcode
  }
docs: // HashCode calculates hash code for a PhysicalProperty object.