[ https://issues.apache.org/jira/browse/THRIFT-5483?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Jens Geyer updated THRIFT-5483: ------------------------------- Description: The generated comparator (and hash code) of Thrift Structs compares two objects by all of their fields, which may cause trouble when used in hash structures. For example, I define a struct like: {code:java} struct Person{ 1: required i64 id 2: required string phoneNumber } {code} The id of a Person is final, while its phoneNumber can be changed. Then I use it as a key in a map to record a Person's supervisors: {code:java} Map<Person, Person> supervisorMap; {code} Apparently, as the generated comparator of Person will use both id and phoneNumber for comparison and hash if I change the phoneNumber of a Person, I can no longer get it from the map as its hash value changes and it will be distributed to another hash slot. Therefore, I wish I could specify the fields that are to be used in comparator and hash code generation. One preferable grammar may be like: {code:java} struct Person{ 1: required comparable i64 id 2: required string phoneNumber } {code} Then the generated comparator and hash code will only use fields marked with `comparable`, and if no fields are marked with comparable, Java's default comparison and hashcode (using object address) will be used. was: The generated comparator (and hash code) of Thrift Structs compares two objects by all of their fields, which may cause trouble when used in hash structures. For example, I define a struct like: {code:thrift} struct Person{ 1: required i64 id 2: required string phoneNumber } {code} The id of a Person is final, while its phoneNumber can be changed. Then I use it as a key in a map to record a Person's supervisors: {code:java} Map<Person, Person> supervisorMap; {code} Apparently, as the generated comparator of Person will use both id and phoneNumber for comparison and hash if I change the phoneNumber of a Person, I can no longer get it from the map as its hash value changes and it will be distributed to another hash slot. Therefore, I wish I could specify the fields that are to be used in comparator and hash code generation. One preferable grammar may be like: {code:thrift} struct Person{ 1: required comparable i64 id 2: required string phoneNumber } {code} Then the generated comparator and hash code will only use fields marked with `comparable`, and if no fields are marked with comparable, Java's default comparison and hashcode (using object address) will be used. > Support customized comparator in Java > ------------------------------------- > > Key: THRIFT-5483 > URL: https://issues.apache.org/jira/browse/THRIFT-5483 > Project: Thrift > Issue Type: Improvement > Components: Java - Compiler > Reporter: Tian Jiang > Priority: Major > > The generated comparator (and hash code) of Thrift Structs compares two > objects by all of their fields, which may cause trouble when used in hash > structures. > For example, I define a struct like: > {code:java} > struct Person{ > 1: required i64 id > 2: required string phoneNumber > } > {code} > The id of a Person is final, while its phoneNumber can be changed. > Then I use it as a key in a map to record a Person's supervisors: > {code:java} > Map<Person, Person> supervisorMap; > {code} > Apparently, as the generated comparator of Person will use both id and > phoneNumber for comparison and hash if I change the phoneNumber of a Person, > I can no longer get it from the map as its hash value changes and it will be > distributed to another hash slot. > Therefore, I wish I could specify the fields that are to be used in > comparator and hash code generation. One preferable grammar may be like: > {code:java} > struct Person{ > 1: required comparable i64 id > 2: required string phoneNumber > } > {code} > Then the generated comparator and hash code will only use fields marked with > `comparable`, and if no fields are marked with comparable, Java's default > comparison and hashcode (using object address) will be used. -- This message was sent by Atlassian Jira (v8.20.1#820001)