diff options
author | Yves Orton <demerphq@gmail.com> | 2021-02-12 10:33:34 +0100 |
---|---|---|
committer | Yves Orton <demerphq@gmail.com> | 2021-02-12 19:21:28 +0100 |
commit | 6027b190154088fbbcbde08a80c49531e4e4c012 (patch) | |
tree | 8d7624926c6307bc316af2258f2310f47e8e13a5 | |
parent | aae087f7cec022be14a17deb95cb2208e16b7891 (diff) | |
download | perl-6027b190154088fbbcbde08a80c49531e4e4c012.tar.gz |
[#18555] hv_func.h - Ensure that hash related data is properly aligned
Andrew Fresh reported that the data being unaligned causes issues and
performance degredation under some or all builds. This is an enhacement
of his original patch to handle the 32 bit case, and to make some
related magic numbers more obvious.
-rw-r--r-- | hv_func.h | 26 |
1 files changed, 16 insertions, 10 deletions
@@ -36,27 +36,31 @@ #if defined(PERL_HASH_FUNC_SIPHASH) # define __PERL_HASH_FUNC "SIPHASH_2_4" -# define __PERL_HASH_SEED_BYTES 16 -# define __PERL_HASH_STATE_BYTES 32 +# define __PERL_HASH_WORD_SIZE sizeof(U64) +# define __PERL_HASH_SEED_BYTES (__PERL_HASH_WORD_SIZE * 2) +# define __PERL_HASH_STATE_BYTES (__PERL_HASH_WORD_SIZE * 4) # define __PERL_HASH_SEED_STATE(seed,state) S_perl_siphash_seed_state(seed,state) # define __PERL_HASH_WITH_STATE(state,str,len) S_perl_hash_siphash_2_4_with_state((state),(U8*)(str),(len)) #elif defined(PERL_HASH_FUNC_SIPHASH13) # define __PERL_HASH_FUNC "SIPHASH_1_3" -# define __PERL_HASH_SEED_BYTES 16 -# define __PERL_HASH_STATE_BYTES 32 +# define __PERL_HASH_WORD_SIZE sizeof(U64) +# define __PERL_HASH_SEED_BYTES (__PERL_HASH_WORD_SIZE * 2) +# define __PERL_HASH_STATE_BYTES (__PERL_HASH_WORD_SIZE * 4) # define __PERL_HASH_SEED_STATE(seed,state) S_perl_siphash_seed_state(seed,state) # define __PERL_HASH_WITH_STATE(state,str,len) S_perl_hash_siphash_1_3_with_state((state),(U8*)(str),(len)) #elif defined(PERL_HASH_FUNC_STADTX) # define __PERL_HASH_FUNC "STADTX" -# define __PERL_HASH_SEED_BYTES 16 -# define __PERL_HASH_STATE_BYTES 32 +# define __PERL_HASH_WORD_SIZE sizeof(U64) +# define __PERL_HASH_SEED_BYTES (__PERL_HASH_WORD_SIZE * 2) +# define __PERL_HASH_STATE_BYTES (__PERL_HASH_WORD_SIZE * 4) # define __PERL_HASH_SEED_STATE(seed,state) stadtx_seed_state(seed,state) # define __PERL_HASH_WITH_STATE(state,str,len) (U32)stadtx_hash_with_state((state),(U8*)(str),(len)) # include "stadtx_hash.h" #elif defined(PERL_HASH_FUNC_ZAPHOD32) # define __PERL_HASH_FUNC "ZAPHOD32" -# define __PERL_HASH_SEED_BYTES 12 -# define __PERL_HASH_STATE_BYTES 12 +# define __PERL_HASH_WORD_SIZE sizeof(U32) +# define __PERL_HASH_SEED_BYTES (__PERL_HASH_WORD_SIZE * 3) +# define __PERL_HASH_STATE_BYTES (__PERL_HASH_WORD_SIZE * 3) # define __PERL_HASH_SEED_STATE(seed,state) zaphod32_seed_state(seed,state) # define __PERL_HASH_WITH_STATE(state,str,len) (U32)zaphod32_hash_with_state((state),(U8*)(str),(len)) # include "zaphod32_hash.h" @@ -87,8 +91,10 @@ #else #define _PERL_HASH_FUNC "SBOX32_WITH_" __PERL_HASH_FUNC - -#define _PERL_HASH_SEED_BYTES ( __PERL_HASH_SEED_BYTES + (int)( 3 * sizeof(U32) ) ) +#define __PERL_HASH_SEED_roundup(x, y) ((((x)+((y)-1))/(y))*(y)) +#define _PERL_HASH_SEED_roundup(x) __PERL_HASH_SEED_roundup(x,__PERL_HASH_WORD_SIZE) +/* note the 3 in the below code comes from the fact the seed to initialize the SBOX is 96 bits */ +#define _PERL_HASH_SEED_BYTES ( _PERL_HASH_SEED_roundup(__PERL_HASH_SEED_BYTES + (int)( 3 * sizeof(U32)) ) ) #define _PERL_HASH_STATE_BYTES \ ( __PERL_HASH_STATE_BYTES + ( ( 1 + ( 256 * SBOX32_MAX_LEN ) ) * sizeof(U32) ) ) |