code: func (nh *NodeHash) hashFrozen(node int64) (int64, error) {
  	// fmt.Printf("hash frozen node=%v\n", node)
  	h := int64(0)
  	_, err := nh.fst.readFirstRealTargetArc(node, nh.scratchArc, nh.in)
  	if err != nil {
  		return 0, err
  	}
  	for {
  		// fmt.Printf("  label=%v target=%v h=%v output=%v next?=%v final?=%v pos=%v\n",
  		// 	nh.scratchArc.Label, nh.scratchArc.target, h,
  		// 	nh.fst.outputs.outputToString(nh.scratchArc.Output),
  		// 	nh.scratchArc.flag(4), nh.scratchArc.IsFinal(), nh.in.getPosition())
  		h = PRIME*h + int64(nh.scratchArc.Label)
  		h = PRIME*h + int64(nh.scratchArc.target^(nh.scratchArc.target>>32))
  		h = PRIME*h + hashPtr(nh.scratchArc.Output)
  		h = PRIME*h + hashPtr(nh.scratchArc.NextFinalOutput)
  		if nh.scratchArc.IsFinal() {
  			h += 17
  		}
  		if nh.scratchArc.isLast() {
  			break
  		}
  		if _, err = nh.fst.readNextRealArc(nh.scratchArc, nh.in); err != nil {
  			return 0, err
  		}
  	}
  	// fmt.Printf("  ret %v\n", int32(h))
  	return h, nil
  }
docs: /* hash code for a frozen node */