-
Notifications
You must be signed in to change notification settings - Fork 1.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix same hashCodes an different queries with include and exclude #4831
base: main
Are you sure you want to change the base?
Fix same hashCodes an different queries with include and exclude #4831
Conversation
@13wjdgk Please sign the Contributor License Agreement! Click here to manually synchronize the status of this Pull Request. See the FAQ for frequently asked questions. |
Instead of toString(), I also considered the following solution. int result = nullSafeHashCodeForCriteria(criteria);
public static int nullSafeHashCodeForCriteria(@Nullable Object obj) {
if (obj == null) {
return 0;
} else if(obj instanceof Map<?,?>){
int result = 0;
for(Entry<?, ?> entry : ((Map<?, ?>)obj).entrySet()){
if(entry.getValue() instanceof Integer){
Integer value = (Integer)entry.getValue();
int valueHashCode;
if(value == 0){
valueHashCode = FieldProjection.EXCLUDE.hashCode();
}
else if(value == 1){
valueHashCode = FieldProjection.INCLUDE.hashCode();
}else{
valueHashCode = value.hashCode();
}
result += entry.getKey().hashCode() ^ valueHashCode;
}else {
result += entry.hashCode();
}
}
return result;
}
return obj.hashCode();
} If you have a better idea, please let me know in the comments! |
f5f6bfd
to
65257f2
Compare
@13wjdgk Thank you for signing the Contributor License Agreement! |
queryWithInclude.fields().include("key1"); | ||
queryWithInclude.fields().include("key2"); | ||
|
||
assertThat(queryWithExclude.hashCode()).isNotEqualTo(queryWithInclude.hashCode()); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Closes #4032
There was a bug where the hashCodes of the exclude and include queries were identical.
The issue was caused by the hashCode calculation in HashMap, where the XOR operation between the hashCode of the key and the hashCode of the value (0 or 1) resulted in duplicate hashCodes.
Since Exclude and Include are differentiated by 0 and 1 and are put into the hashMap, they were vulnerable to returning duplicate hashCodes.
To resolve this, the fix involved combining the key and value of the HashMap into a single String and calculating the hashCode based on that.