You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@thrift.apache.org by "Tian Jiang (Jira)" <ji...@apache.org> on 2021/12/02 03:35:00 UTC
[jira] [Updated] (THRIFT-5483) Support customized comparator in Java
[ https://issues.apache.org/jira/browse/THRIFT-5483?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Tian Jiang 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: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 so 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.
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 defined 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 so 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
> 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: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 so 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.
--
This message was sent by Atlassian Jira
(v8.20.1#820001)