Fix hashCode/equals inconsistency for negative zero in Duration and DataSize (#1932)

This commit is contained in:
Aashish Mahato authored and GitHub committed 2026-10-22 09:07:34 -07:00
1 parent 3f5797de6f
commit dd83b9ab4f
4 files changed
+16 -4

No files matched your search

@@ -247,7 +247,8 @@ public final class DataSize implements Value {
@Override
public int hashCode() {
return Double.hashCode(convertValueTo(DataSizeUnit.BYTES));
// adding 0.0 normalizes -0.0 to 0.0, because -0.0 == 0.0 but their hash codes differ
return Double.hashCode(convertValueTo(DataSizeUnit.BYTES) + 0.0);
}
@Override
@@ -222,7 +222,8 @@ public final class Duration implements Value {
@Override
public int hashCode() {
return Double.hashCode(convertValueTo(DurationUnit.NANOS));
// adding 0.0 normalizes -0.0 to 0.0, because -0.0 == 0.0 but their hash codes differ
return Double.hashCode(convertValueTo(DurationUnit.NANOS) + 0.0);
}
@Override
@@ -1,5 +1,5 @@
/*
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
* Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -121,5 +121,10 @@ class DataSizeTest {
assertThat(size3.hashCode()).isNotEqualTo(size1.hashCode())
assertThat(size2.hashCode()).isNotEqualTo(size3.hashCode())
// -0.0 == 0.0, so equal sizes must have equal hash codes
assertThat(DataSize(0.0, BYTES)).isEqualTo(DataSize(-0.0, BYTES))
assertThat(DataSize(0.0, BYTES).hashCode()).isEqualTo(DataSize(-0.0, BYTES).hashCode())
assertThat(DataSize(0.0, BYTES).hashCode()).isEqualTo(DataSize(-0.0, PEBIBYTES).hashCode())
}
}
@@ -1,5 +1,5 @@
/*
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
* Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -285,5 +285,10 @@ class DurationTest {
assertThat(duration3.hashCode()).isNotEqualTo(duration1.hashCode())
assertThat(duration2.hashCode()).isNotEqualTo(duration3.hashCode())
// -0.0 == 0.0, so equal durations must have equal hash codes
assertThat(Duration(0.0, MILLIS)).isEqualTo(Duration(-0.0, MILLIS))
assertThat(Duration(0.0, MILLIS).hashCode()).isEqualTo(Duration(-0.0, MILLIS).hashCode())
assertThat(Duration(0.0, NANOS).hashCode()).isEqualTo(Duration(-0.0, DAYS).hashCode())
}
}