@Override
    public int hashCode() {
        Serializable id = getId();
        if (id != null) {
            return id.hashCode();
        }
        int hashCode = getStartTimestamp() != null ? getStartTimestamp().hashCode() : 0;
        hashCode = 31 * hashCode + (getStopTimestamp() != null ? getStopTimestamp().hashCode() : 0);
        hashCode = 31 * hashCode + (getLastAccessTime() != null ? getLastAccessTime().hashCode() : 0);
        hashCode = 31 * hashCode + Long.valueOf(Math.max(getTimeout(), 0)).hashCode();
        hashCode = 31 * hashCode + Boolean.valueOf(isExpired()).hashCode();
        hashCode = 31 * hashCode + (getHost() != null ? getHost().hashCode() : 0);
        hashCode = 31 * hashCode + (getAttributes() != null ? getAttributes().hashCode() : 0);
        return hashCode;
    }
Returns the hashCode.  If the {@link #getId() id} is not {@code null}, its hashcode is returned immediately.
If it is {@code null}, an attributes-based hashCode will be calculated and returned.
<p/>
Do your best to ensure {@code SimpleSession} instances receive an ID very early in their lifecycle to
avoid the more expensive attributes-based calculation.

@return this object's hashCode
@since 1.0
core/src/main/java/org/apache/shiro/session/mgt/SimpleSession.java