Line data Source code
1 : /*-------------------------------------------------------------------------
2 : *
3 : * checksum_block_internal.h
4 : * Core algorithm for page checksums, semi-private to checksum_impl.h
5 : * and checksum.c.
6 : *
7 : * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
8 : * Portions Copyright (c) 1994, Regents of the University of California
9 : *
10 : * src/include/storage/checksum_block_internal.h
11 : *
12 : *-------------------------------------------------------------------------
13 : */
14 :
15 : /* there is deliberately not an #ifndef CHECKSUM_BLOCK_INTERNAL_H here */
16 :
17 : uint32 sums[N_SUMS];
18 2680325 : uint32 result = 0;
19 : uint32 i,
20 : j;
21 :
22 : /* ensure that the size is compatible with the algorithm */
23 : Assert(sizeof(PGChecksummablePage) == BLCKSZ);
24 :
25 : /* initialize partial checksums to their corresponding offsets */
26 2680325 : memcpy(sums, checksumBaseOffsets, sizeof(checksumBaseOffsets));
27 :
28 : /* main checksum calculation */
29 174221125 : for (i = 0; i < (uint32) (BLCKSZ / (sizeof(uint32) * N_SUMS)); i++)
30 5660846400 : for (j = 0; j < N_SUMS; j++)
31 5489305600 : CHECKSUM_COMP(sums[j], page->data[i][j]);
32 :
33 : /* finally add in two rounds of zeroes for additional mixing */
34 8040975 : for (i = 0; i < 2; i++)
35 176901450 : for (j = 0; j < N_SUMS; j++)
36 171540800 : CHECKSUM_COMP(sums[j], 0);
37 :
38 : /* xor fold partial checksums together */
39 88450725 : for (i = 0; i < N_SUMS; i++)
40 85770400 : result ^= sums[i];
41 :
42 2680325 : return result;
|