public int hashCode() {
#if (!$superHasHashCode && $fields.size() == 1)
  #set($field = $fields.get(0))
  #if ($field.primitive)
#addTempForOneField($field)
    return #addPrimitiveFieldHashCode($field);
  #else
    return #addFieldHashCode($field, false);
  #end
#elseif ($fields.size() > 0)
  #set($resultName = $helper.getUniqueLocalVarName("result", $fields, $settings))
  int $resultName ##
  #set($resultAssigned = false)
  #set($resultDeclarationCompleted = false)
  #if ($superHasHashCode)
    = #addSuperHashCode();
    #set($resultAssigned = true)
    #set($resultDeclarationCompleted = true)
  #end
  #addTempDeclaration($resultDeclarationCompleted)
  #set($tempName = "#addTempDeclaration($resultDeclarationCompleted)")
  #foreach($field in $fields)
    #addTempAssignment($field)
    #if ($resultDeclarationCompleted)
      $resultName ##
    #end
    = ##
    #if ($resultAssigned)
        31 * $resultName + ##
    #end
    #if ($field.primitive)
      #addPrimitiveFieldHashCode($field)##
    #else
      #addFieldHashCode($field, $resultAssigned)##
    #end
    ;
    #set($resultAssigned = true)
    #set($resultDeclarationCompleted = true)
  #end
  return $resultName;
#else
  return 0;
#end
}
##
#macro (addPrimitiveFieldHashCode $field)
  #set ($fName = $field.accessor)
  #if ($field.byte || $field.short || $field.char)
    (int) $fName##
  #elseif ($field.long)
    (int)($fName ^ ($fName >>> 32))##
  #elseif ($field.boolean)
    ($fName ? 1 : 0)##
  #elseif ($field.float)
    ($fName != +0.0f ? java.lang.Float.floatToIntBits($fName) : 0)##
  #elseif ($field.double)
    #set($tempName = "#getTempVarName()")
    (int) ($tempName ^ ($tempName >>> 32))##
  #elseif ($field.void)
    0##
  #else
    $fName##
  #end
#end
##
#macro(getTempVarName)
  $helper.getUniqueLocalVarName("temp", $fields, $settings)##
#end
##
#macro(addTempForOneField $field)
  #if ($field.double)
    #if ($settings.generateFinalLocals)
    final ##
    #end
  #set($tempName = "#getTempVarName()")
  long $tempName = java.lang.Double.doubleToLongBits($field.accessor);
  #end
#end
##
#macro(adjustHashCodeToArrays $field)
   #if ($field.array && $java_version > 4)
    #if ($field.nestedArray)
      java.util.Arrays.deepHashCode($field.accessor)##
    #else
      java.util.Arrays.hashCode($field.accessor)##
    #end
  #else
    ${field.accessor}.hashCode()##
  #end
#end
##
#macro(addSuperHashCode)
  #if ($superHasHashCode)
    super.hashCode()##
  #else
    0##
  #end
#end
##
#macro(addTempDeclaration $resultDeclarationCompleted)
  #foreach($field in $fields)
    #if ($field.double)
      #if (!$resultDeclarationCompleted)
        ;
      #end
      #set($tempName = "#getTempVarName()")
      long $tempName;
      #set($resultDeclarationCompleted = true)
      #break
    #end
  #end
#end
##
#macro(addTempAssignment $field)
  #if ($field.double)
    #set($tempName = "#getTempVarName()")
    $tempName = java.lang.Double.doubleToLongBits($field.accessor);
  #end
#end
##
#macro(addFieldHashCode $field $brace)
#set($name = $field.accessor)
ObjectUtils.nullSafeHashCode($name)##
#end
