[ 
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)

Reply via email to