• Heikki Linnakangas's avatar
    Switch to CRC-32C in WAL and other places. · 5028f22f
    Heikki Linnakangas authored
    The old algorithm was found to not be the usual CRC-32 algorithm, used by
    Ethernet et al. We were using a non-reflected lookup table with code meant
    for a reflected lookup table. That's a strange combination that AFAICS does
    not correspond to any bit-wise CRC calculation, which makes it difficult to
    reason about its properties. Although it has worked well in practice, seems
    safer to use a well-known algorithm.
    
    Since we're changing the algorithm anyway, we might as well choose a
    different polynomial. The Castagnoli polynomial has better error-correcting
    properties than the traditional CRC-32 polynomial, even if we had
    implemented it correctly. Another reason for picking that is that some new
    CPUs have hardware support for calculating CRC-32C, but not CRC-32, let
    alone our strange variant of it. This patch doesn't add any support for such
    hardware, but a future patch could now do that.
    
    The old algorithm is kept around for tsquery and pg_trgm, which use the
    values in indexes that need to remain compatible so that pg_upgrade works.
    While we're at it, share the old lookup table for CRC-32 calculation
    between hstore, ltree and core. They all use the same table, so might as
    well.
    5028f22f
xlogreader.c 26.2 KB