added hashCode implementation (because we implemented equals, and two equaling objects must return same hashCode)