updated hasCode, equals