@@ -228,6 +228,7 @@ struct ZSTD_matchState_t {
228228 U32 rowHashLog ; /* For row-based matchfinder: Hashlog based on nb of rows in the hashTable.*/
229229 U16 * tagTable ; /* For row-based matchFinder: A row-based table containing the hashes and head index. */
230230 U32 hashCache [ZSTD_ROW_HASH_CACHE_SIZE ]; /* For row-based matchFinder: a cache of hashes to improve speed */
231+ U64 hashSalt ;
231232
232233 U32 * hashTable ;
233234 U32 * hashTable3 ;
@@ -787,28 +788,35 @@ ZSTD_count_2segments(const BYTE* ip, const BYTE* match,
787788 * Hashes
788789 ***************************************/
789790static const U32 prime3bytes = 506832829U ;
790- static U32 ZSTD_hash3 (U32 u , U32 h ) { assert (h <= 32 ); return ((u << (32 - 24 )) * prime3bytes ) >> (32 - h ) ; }
791- MEM_STATIC size_t ZSTD_hash3Ptr (const void * ptr , U32 h ) { return ZSTD_hash3 (MEM_readLE32 (ptr ), h ); } /* only in zstd_opt.h */
791+ static U32 ZSTD_hash3 (U32 u , U32 h , U32 s ) { assert (h <= 32 ); return (((u << (32 - 24 )) * prime3bytes ) ^ s ) >> (32 - h ) ; }
792+ MEM_STATIC size_t ZSTD_hash3Ptr (const void * ptr , U32 h ) { return ZSTD_hash3 (MEM_readLE32 (ptr ), h , 0 ); } /* only in zstd_opt.h */
793+ MEM_STATIC size_t ZSTD_hash3PtrS (const void * ptr , U32 h , U32 s ) { return ZSTD_hash3 (MEM_readLE32 (ptr ), h , s ); }
792794
793795static const U32 prime4bytes = 2654435761U ;
794- static U32 ZSTD_hash4 (U32 u , U32 h ) { assert (h <= 32 ); return (u * prime4bytes ) >> (32 - h ) ; }
795- static size_t ZSTD_hash4Ptr (const void * ptr , U32 h ) { return ZSTD_hash4 (MEM_readLE32 (ptr ), h ); }
796+ static U32 ZSTD_hash4 (U32 u , U32 h , U32 s ) { assert (h <= 32 ); return ((u * prime4bytes ) ^ s ) >> (32 - h ) ; }
797+ static size_t ZSTD_hash4Ptr (const void * ptr , U32 h ) { return ZSTD_hash4 (MEM_readLE32 (ptr ), h , 0 ); }
798+ static size_t ZSTD_hash4PtrS (const void * ptr , U32 h , U32 s ) { return ZSTD_hash4 (MEM_readLE32 (ptr ), h , s ); }
796799
797800static const U64 prime5bytes = 889523592379ULL ;
798- static size_t ZSTD_hash5 (U64 u , U32 h ) { assert (h <= 64 ); return (size_t )(((u << (64 - 40 )) * prime5bytes ) >> (64 - h )) ; }
799- static size_t ZSTD_hash5Ptr (const void * p , U32 h ) { return ZSTD_hash5 (MEM_readLE64 (p ), h ); }
801+ static size_t ZSTD_hash5 (U64 u , U32 h , U64 s ) { assert (h <= 64 ); return (size_t )((((u << (64 - 40 )) * prime5bytes ) ^ s ) >> (64 - h )) ; }
802+ static size_t ZSTD_hash5Ptr (const void * p , U32 h ) { return ZSTD_hash5 (MEM_readLE64 (p ), h , 0 ); }
803+ static size_t ZSTD_hash5PtrS (const void * p , U32 h , U64 s ) { return ZSTD_hash5 (MEM_readLE64 (p ), h , s ); }
800804
801805static const U64 prime6bytes = 227718039650203ULL ;
802- static size_t ZSTD_hash6 (U64 u , U32 h ) { assert (h <= 64 ); return (size_t )(((u << (64 - 48 )) * prime6bytes ) >> (64 - h )) ; }
803- static size_t ZSTD_hash6Ptr (const void * p , U32 h ) { return ZSTD_hash6 (MEM_readLE64 (p ), h ); }
806+ static size_t ZSTD_hash6 (U64 u , U32 h , U64 s ) { assert (h <= 64 ); return (size_t )((((u << (64 - 48 )) * prime6bytes ) ^ s ) >> (64 - h )) ; }
807+ static size_t ZSTD_hash6Ptr (const void * p , U32 h ) { return ZSTD_hash6 (MEM_readLE64 (p ), h , 0 ); }
808+ static size_t ZSTD_hash6PtrS (const void * p , U32 h , U64 s ) { return ZSTD_hash6 (MEM_readLE64 (p ), h , s ); }
804809
805810static const U64 prime7bytes = 58295818150454627ULL ;
806- static size_t ZSTD_hash7 (U64 u , U32 h ) { assert (h <= 64 ); return (size_t )(((u << (64 - 56 )) * prime7bytes ) >> (64 - h )) ; }
807- static size_t ZSTD_hash7Ptr (const void * p , U32 h ) { return ZSTD_hash7 (MEM_readLE64 (p ), h ); }
811+ static size_t ZSTD_hash7 (U64 u , U32 h , U64 s ) { assert (h <= 64 ); return (size_t )((((u << (64 - 56 )) * prime7bytes ) ^ s ) >> (64 - h )) ; }
812+ static size_t ZSTD_hash7Ptr (const void * p , U32 h ) { return ZSTD_hash7 (MEM_readLE64 (p ), h , 0 ); }
813+ static size_t ZSTD_hash7PtrS (const void * p , U32 h , U64 s ) { return ZSTD_hash7 (MEM_readLE64 (p ), h , s ); }
808814
809815static const U64 prime8bytes = 0xCF1BBCDCB7A56463ULL ;
810- static size_t ZSTD_hash8 (U64 u , U32 h ) { assert (h <= 64 ); return (size_t )(((u ) * prime8bytes ) >> (64 - h )) ; }
811- static size_t ZSTD_hash8Ptr (const void * p , U32 h ) { return ZSTD_hash8 (MEM_readLE64 (p ), h ); }
816+ static size_t ZSTD_hash8 (U64 u , U32 h , U64 s ) { assert (h <= 64 ); return (size_t )((((u ) * prime8bytes ) ^ s ) >> (64 - h )) ; }
817+ static size_t ZSTD_hash8Ptr (const void * p , U32 h ) { return ZSTD_hash8 (MEM_readLE64 (p ), h , 0 ); }
818+ static size_t ZSTD_hash8PtrS (const void * p , U32 h , U64 s ) { return ZSTD_hash8 (MEM_readLE64 (p ), h , s ); }
819+
812820
813821MEM_STATIC FORCE_INLINE_ATTR
814822size_t ZSTD_hashPtr (const void * p , U32 hBits , U32 mls )
@@ -828,6 +836,24 @@ size_t ZSTD_hashPtr(const void* p, U32 hBits, U32 mls)
828836 }
829837}
830838
839+ MEM_STATIC FORCE_INLINE_ATTR
840+ size_t ZSTD_hashPtrSalted (const void * p , U32 hBits , U32 mls , const U64 hashSalt ) {
841+ /* Although some of these hashes do support hBits up to 64, some do not.
842+ * To be on the safe side, always avoid hBits > 32. */
843+ assert (hBits <= 32 );
844+
845+ switch (mls )
846+ {
847+ default :
848+ case 4 : return ZSTD_hash4PtrS (p , hBits , (U32 )hashSalt );
849+ case 5 : return ZSTD_hash5PtrS (p , hBits , hashSalt );
850+ case 6 : return ZSTD_hash6PtrS (p , hBits , hashSalt );
851+ case 7 : return ZSTD_hash7PtrS (p , hBits , hashSalt );
852+ case 8 : return ZSTD_hash8PtrS (p , hBits , hashSalt );
853+ }
854+ }
855+
856+
831857/** ZSTD_ipow() :
832858 * Return base^exponent.
833859 */
0 commit comments