Skip to content

Conversation

@lemire
Copy link
Member

@lemire lemire commented Nov 26, 2025

This simplifies the CheckSum function. I am not expecting nor seeing a performance difference. I am also adding a check to make sure we do not check the CheckSum results.

 benchstat   old.txt new.txt             
goos: darwin
goarch: arm64
pkg: github.com/RoaringBitmap/roaring/v2
cpu: Apple M4 Max
                                        │       old.txt       │                   new.txt                   │
                                        │       sec/op        │       sec/op         vs base                │
Checksum/checksum-1-14                    0.0000003000n ± ∞ ¹   0.0000001000n ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-1-14         0.0000001000n ± ∞ ¹   0.0000001000n ± ∞ ¹       ~ (p=1.000 n=1) ³
Checksum/checksum-2-14                                          0.0000001000n ± ∞ ¹
Checksum/checksum-compressed-2-14         0.0000001000n ± ∞ ¹   0.0000002000n ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-4-14                    0.0000001000n ± ∞ ¹   0.0000001000n ± ∞ ¹       ~ (p=1.000 n=1) ³
Checksum/checksum-compressed-4-14         0.0000001000n ± ∞ ¹   0.0000001000n ± ∞ ¹       ~ (p=1.000 n=1) ³
Checksum/checksum-8-14                    0.0000001000n ± ∞ ¹   0.0000002000n ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-8-14         0.0000001000n ± ∞ ¹   0.0000002000n ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-16-14                   0.0000002000n ± ∞ ¹   0.0000001000n ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-16-14        0.0000002000n ± ∞ ¹   0.0000002000n ± ∞ ¹       ~ (p=1.000 n=1) ³
Checksum/checksum-32-14                   0.0000002000n ± ∞ ¹   0.0000002000n ± ∞ ¹       ~ (p=1.000 n=1) ³
Checksum/checksum-compressed-32-14        0.0000002000n ± ∞ ¹   0.0000004000n ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-64-14                   0.0000005000n ± ∞ ¹   0.0000003000n ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-64-14        0.0000006000n ± ∞ ¹   0.0000005000n ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-128-14                  0.0000005000n ± ∞ ¹   0.0000005000n ± ∞ ¹       ~ (p=1.000 n=1) ³
Checksum/checksum-compressed-128-14       0.0000008000n ± ∞ ¹   0.0000008000n ± ∞ ¹       ~ (p=1.000 n=1) ³
Checksum/checksum-256-14                  0.0000008000n ± ∞ ¹   0.0000091000n ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-256-14        0.000001500n ± ∞ ¹    0.000001500n ± ∞ ¹       ~ (p=1.000 n=1) ³
Checksum/checksum-512-14                   0.000001500n ± ∞ ¹    0.000001500n ± ∞ ¹       ~ (p=1.000 n=1) ³
Checksum/checksum-compressed-512-14        0.000002700n ± ∞ ¹    0.000002500n ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-1024-14                  0.000002700n ± ∞ ¹    0.000002700n ± ∞ ¹       ~ (p=1.000 n=1) ³
Checksum/checksum-compressed-1024-14       0.000005000n ± ∞ ¹    0.000004900n ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-2048-14                  0.000005400n ± ∞ ¹    0.000005400n ± ∞ ¹       ~ (p=1.000 n=1) ³
Checksum/checksum-compressed-2048-14       0.000009500n ± ∞ ¹    0.000009300n ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-4096-14                   0.00001060n ± ∞ ¹     0.00001050n ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-4096-14        0.00001570n ± ∞ ¹     0.00001590n ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-8192-14                   0.00002110n ± ∞ ¹     0.00001960n ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-8192-14        0.00001960n ± ∞ ¹     0.00002190n ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-16384-14                  0.00004000n ± ∞ ¹     0.00003840n ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-16384-14       0.00002500n ± ∞ ¹     0.00002550n ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-32768-14                  0.00007310n ± ∞ ¹     0.00007680n ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-32768-14       0.00001480n ± ∞ ¹     0.00001850n ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-65536-14                   0.0001350n ± ∞ ¹      0.0001363n ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-65536-14      0.000003300n ± ∞ ¹    0.000004200n ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-131072-14                  0.0001757n ± ∞ ¹      0.0002001n ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-131072-14    0.0000003000n ± ∞ ¹   0.0000004000n ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-262144-14                  0.0002299n ± ∞ ¹      0.0001968n ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-262144-14    0.0000003000n ± ∞ ¹   0.0000002000n ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-524288-14                  0.0001927n ± ∞ ¹      0.0002065n ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-524288-14    0.0000003000n ± ∞ ¹   0.0000003000n ± ∞ ¹       ~ (p=1.000 n=1) ³
Checksum/checksum-1048576-14                 0.0002274n ± ∞ ¹      0.0001977n ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-1048576-14   0.0000004000n ± ∞ ¹   0.0000003000n ± ∞ ¹       ~ (p=1.000 n=1) ²
geomean                                    0.000002206n          0.000002183n        +6.66%
¹ need >= 6 samples for confidence interval at level 0.95
² need >= 4 samples to detect a difference at alpha level 0.05
³ all samples are equal

                                        │   old.txt   │               new.txt               │
                                        │    B/op     │    B/op      vs base                │
Checksum/checksum-1-14                    0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-1-14         0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-2-14                    0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-2-14         0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-4-14                    0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-4-14         0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-8-14                    0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-8-14         0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-16-14                   0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-16-14        0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-32-14                   0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-32-14        0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-64-14                   0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-64-14        0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-128-14                  0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-128-14       0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-256-14                  0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-256-14       0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-512-14                  0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-512-14       0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-1024-14                 0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-1024-14      0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-2048-14                 0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-2048-14      0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-4096-14                 0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-4096-14      0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-8192-14                 0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-8192-14      0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-16384-14                0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-16384-14     0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-32768-14                0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-32768-14     0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-65536-14                0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-65536-14     0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-131072-14               0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-131072-14    0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-262144-14               0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-262144-14    0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-524288-14               0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-524288-14    0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-1048576-14              0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-1048576-14   0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
geomean                                             ³                +0.00%               ³
¹ need >= 6 samples for confidence interval at level 0.95
² all samples are equal
³ summaries must be >0 to compute geomean

                                        │   old.txt   │               new.txt               │
                                        │  allocs/op  │  allocs/op   vs base                │
Checksum/checksum-1-14                    0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-1-14         0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-2-14                    0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-2-14         0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-4-14                    0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-4-14         0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-8-14                    0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-8-14         0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-16-14                   0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-16-14        0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-32-14                   0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-32-14        0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-64-14                   0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-64-14        0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-128-14                  0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-128-14       0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-256-14                  0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-256-14       0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-512-14                  0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-512-14       0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-1024-14                 0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-1024-14      0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-2048-14                 0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-2048-14      0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-4096-14                 0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-4096-14      0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-8192-14                 0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-8192-14      0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-16384-14                0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-16384-14     0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-32768-14                0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-32768-14     0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-65536-14                0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-65536-14     0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-131072-14               0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-131072-14    0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-262144-14               0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-262144-14    0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-524288-14               0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-524288-14    0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-1048576-14              0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
Checksum/checksum-compressed-1048576-14   0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
geomean                                             ³                +0.00%               ³
¹ need >= 6 samples for confidence interval at level 0.95
² all samples are equal
³ summaries must be >0 to compute geomean

                       │   old.txt   │
                       │    ns/op    │
Checksum/checksum-2-14   0.000 ± ∞ ¹
¹ need >= 6 samples for confidence interval at level 0.95

hash ^= uint64(val & 0xFF)
hash *= prime
// Hash high byte
hash ^= uint64(val >> 8)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this be val >> 8 & 0xFF? I guess it doesn't matter as it's a uint16. It was just visually noticeable compare to the block above.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it is ok because the semantic is clear.

@happygiraffe
Copy link
Collaborator

Looks good to me:

  • the code isn't using the serialization functions, which could call unsafe functions
  • it's clear what the hash is actually doing
  • I'm happy that there is no functional change

@lemire
Copy link
Member Author

lemire commented Nov 26, 2025

@happygiraffe Thanks.

I will let it stew in case someone has other comments.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants