RFR: 8294432: Add provisions to calculate hash values from MemorySegments

Per Minborg pminborg at openjdk.org
Tue Nov 26 12:01:21 UTC 2024


This PR proposes adding a _JDK-internal_ method for calculating hash codes for content in a `MemorySegment`.

The internal method uses a polynomial 32-bit hash function equivalent to `Arrays::hashCode`. The new method is almost two times faster than naïvely iterating over individual bytes for larger regions. Also, it is more lean on inlining space compared to a naïve loop.



Benchmark                          (ELEM_SIZE)  Mode  Cnt   Score   Error  Units
SegmentBulkHash.array                        8  avgt   30   2.645 ? 0.078  ns/op
SegmentBulkHash.array                       64  avgt   30   6.062 ? 0.171  ns/op
SegmentBulkHash.heapSegment                  8  avgt   30   4.181 ? 0.145  ns/op
SegmentBulkHash.heapSegment                 64  avgt   30  25.716 ? 1.043  ns/op
SegmentBulkHash.nativeSegment                8  avgt   30   3.939 ? 0.150  ns/op
SegmentBulkHash.nativeSegment               64  avgt   30  23.262 ? 0.694  ns/op
SegmentBulkHash.nativeSegmentJava            8  avgt   30   5.219 ? 0.183  ns/op    <- Naïve iteration
SegmentBulkHash.nativeSegmentJava           64  avgt   30  39.668 ? 1.040  ns/op    <- Naïve iteration


![image](https://github.com/user-attachments/assets/5646cf21-b202-4dce-9555-e460f9df4cb6)


If internal JDK code uses this method, it will automatically benefit from future performance improvements that can be implemented once the Vector API becomes available.

-------------

Commit messages:
 - Chage type declarations in benchmark
 - Clean up and add doc
 - Add content hash method and tests
 - Use parameter i tests
 - Remove debug line
 - Add an internal contentHash method

Changes: https://git.openjdk.org/jdk/pull/22364/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=22364&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8294432
  Stats: 338 lines in 3 files changed: 338 ins; 0 del; 0 mod
  Patch: https://git.openjdk.org/jdk/pull/22364.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/22364/head:pull/22364

PR: https://git.openjdk.org/jdk/pull/22364


More information about the core-libs-dev mailing list