added hashCode() to match equals()