digest-xxhash 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE +1 -1
- data/ext/digest/xxhash/ext.c +1 -1
- data/ext/digest/xxhash/xxhash.h +187 -70
- data/lib/digest/xxhash/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 67c1180d8629bae85bc269796cdae0b67e1fb1942dd5048906c5b785b94b878b
|
4
|
+
data.tar.gz: 0f35b3b820f91b12e0439e91dac4bf45a390dfc901d20c730d746886c132ca5a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e7177998d433255ccb0e222257f9161c2e9514418052cf757621b3b13fbdb348dc6a47bd460b94398466496b28ebc7c06b845fc44329156a46309aef749c3bd5
|
7
|
+
data.tar.gz: af71a1e091b287e7d2ff9a41f74fc1adb2af73f625a66c9a5f1d64d3001c99034ec00e5b88085d93362b0820e0a33e2ad1f5f70df8b19551247d9a8d84d757da
|
data/LICENSE
CHANGED
data/ext/digest/xxhash/ext.c
CHANGED
data/ext/digest/xxhash/xxhash.h
CHANGED
@@ -121,29 +121,78 @@ extern "C" {
|
|
121
121
|
|
122
122
|
/*
|
123
123
|
* This part deals with the special case where a unit wants to inline xxHash,
|
124
|
-
* but "xxhash.h" has previously been included without XXH_INLINE_ALL,
|
125
|
-
* as part of some previously included *.h header file.
|
124
|
+
* but "xxhash.h" has previously been included without XXH_INLINE_ALL,
|
125
|
+
* such as part of some previously included *.h header file.
|
126
126
|
* Without further action, the new include would just be ignored,
|
127
127
|
* and functions would effectively _not_ be inlined (silent failure).
|
128
128
|
* The following macros solve this situation by prefixing all inlined names,
|
129
129
|
* avoiding naming collision with previous inclusions.
|
130
130
|
*/
|
131
|
-
#
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
#
|
131
|
+
/* Before that, we unconditionally #undef all symbols,
|
132
|
+
* in case they were already defined with XXH_NAMESPACE.
|
133
|
+
* They will then be redefined for XXH_INLINE_ALL
|
134
|
+
*/
|
135
|
+
# undef XXH_versionNumber
|
136
|
+
/* XXH32 */
|
137
|
+
# undef XXH32
|
138
|
+
# undef XXH32_createState
|
139
|
+
# undef XXH32_freeState
|
140
|
+
# undef XXH32_reset
|
141
|
+
# undef XXH32_update
|
142
|
+
# undef XXH32_digest
|
143
|
+
# undef XXH32_copyState
|
144
|
+
# undef XXH32_canonicalFromHash
|
145
|
+
# undef XXH32_hashFromCanonical
|
146
|
+
/* XXH64 */
|
147
|
+
# undef XXH64
|
148
|
+
# undef XXH64_createState
|
149
|
+
# undef XXH64_freeState
|
150
|
+
# undef XXH64_reset
|
151
|
+
# undef XXH64_update
|
152
|
+
# undef XXH64_digest
|
153
|
+
# undef XXH64_copyState
|
154
|
+
# undef XXH64_canonicalFromHash
|
155
|
+
# undef XXH64_hashFromCanonical
|
156
|
+
/* XXH3_64bits */
|
157
|
+
# undef XXH3_64bits
|
158
|
+
# undef XXH3_64bits_withSecret
|
159
|
+
# undef XXH3_64bits_withSeed
|
160
|
+
# undef XXH3_createState
|
161
|
+
# undef XXH3_freeState
|
162
|
+
# undef XXH3_copyState
|
163
|
+
# undef XXH3_64bits_reset
|
164
|
+
# undef XXH3_64bits_reset_withSeed
|
165
|
+
# undef XXH3_64bits_reset_withSecret
|
166
|
+
# undef XXH3_64bits_update
|
167
|
+
# undef XXH3_64bits_digest
|
168
|
+
# undef XXH3_generateSecret
|
169
|
+
/* XXH3_128bits */
|
170
|
+
# undef XXH128
|
171
|
+
# undef XXH3_128bits
|
172
|
+
# undef XXH3_128bits_withSeed
|
173
|
+
# undef XXH3_128bits_withSecret
|
174
|
+
# undef XXH3_128bits_reset
|
175
|
+
# undef XXH3_128bits_reset_withSeed
|
176
|
+
# undef XXH3_128bits_reset_withSecret
|
177
|
+
# undef XXH3_128bits_update
|
178
|
+
# undef XXH3_128bits_digest
|
179
|
+
# undef XXH128_isEqual
|
180
|
+
# undef XXH128_cmp
|
181
|
+
# undef XXH128_canonicalFromHash
|
182
|
+
# undef XXH128_hashFromCanonical
|
183
|
+
/* Finally, free the namespace itself */
|
184
|
+
# undef XXH_NAMESPACE
|
185
|
+
|
186
|
+
/* employ the namespace for XXH_INLINE_ALL */
|
138
187
|
# define XXH_NAMESPACE XXH_INLINE_
|
139
188
|
/*
|
140
|
-
* Some identifiers (enums, type names) are not symbols,
|
141
|
-
*
|
189
|
+
* Some identifiers (enums, type names) are not symbols,
|
190
|
+
* but they must nonetheless be renamed to avoid redeclaration.
|
142
191
|
* Alternative solution: do not redeclare them.
|
143
|
-
* However, this requires some #ifdefs, and
|
144
|
-
* Meanwhile, renaming can be achieved in a single
|
192
|
+
* However, this requires some #ifdefs, and has a more dispersed impact.
|
193
|
+
* Meanwhile, renaming can be achieved in a single place.
|
145
194
|
*/
|
146
|
-
# define XXH_IPREF(Id)
|
195
|
+
# define XXH_IPREF(Id) XXH_NAMESPACE ## Id
|
147
196
|
# define XXH_OK XXH_IPREF(XXH_OK)
|
148
197
|
# define XXH_ERROR XXH_IPREF(XXH_ERROR)
|
149
198
|
# define XXH_errorcode XXH_IPREF(XXH_errorcode)
|
@@ -266,7 +315,7 @@ extern "C" {
|
|
266
315
|
***************************************/
|
267
316
|
#define XXH_VERSION_MAJOR 0
|
268
317
|
#define XXH_VERSION_MINOR 8
|
269
|
-
#define XXH_VERSION_RELEASE
|
318
|
+
#define XXH_VERSION_RELEASE 1
|
270
319
|
#define XXH_VERSION_NUMBER (XXH_VERSION_MAJOR *100*100 + XXH_VERSION_MINOR *100 + XXH_VERSION_RELEASE)
|
271
320
|
|
272
321
|
/*!
|
@@ -275,7 +324,7 @@ extern "C" {
|
|
275
324
|
* This is only useful when xxHash is compiled as a shared library, as it is
|
276
325
|
* independent of the version defined in the header.
|
277
326
|
*
|
278
|
-
* @return `XXH_VERSION_NUMBER` as of when the
|
327
|
+
* @return `XXH_VERSION_NUMBER` as of when the libray was compiled.
|
279
328
|
*/
|
280
329
|
XXH_PUBLIC_API unsigned XXH_versionNumber (void);
|
281
330
|
|
@@ -297,11 +346,13 @@ typedef enum { XXH_OK=0, XXH_ERROR } XXH_errorcode;
|
|
297
346
|
* Not necessarily defined to `uint32_t` but functionally equivalent.
|
298
347
|
*/
|
299
348
|
typedef uint32_t XXH32_hash_t;
|
349
|
+
|
300
350
|
#elif !defined (__VMS) \
|
301
351
|
&& (defined (__cplusplus) \
|
302
352
|
|| (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) )
|
303
353
|
# include <stdint.h>
|
304
354
|
typedef uint32_t XXH32_hash_t;
|
355
|
+
|
305
356
|
#else
|
306
357
|
# include <limits.h>
|
307
358
|
# if UINT_MAX == 0xFFFFFFFFUL
|
@@ -543,6 +594,38 @@ XXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t
|
|
543
594
|
XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src);
|
544
595
|
|
545
596
|
|
597
|
+
/*
|
598
|
+
Define XXH_FALLTHROUGH macro for annotating switch case with the 'fallthrough' attribute
|
599
|
+
introduced in CPP17 and C23.
|
600
|
+
CPP17 : https://en.cppreference.com/w/cpp/language/attributes/fallthrough
|
601
|
+
C23 : https://en.cppreference.com/w/c/language/attributes/fallthrough
|
602
|
+
*/
|
603
|
+
|
604
|
+
#if defined (__has_c_attribute) && defined (__STDC_VERSION__) && (__STDC_VERSION__ > 201710L) /* C2x */
|
605
|
+
# if __has_c_attribute(fallthrough)
|
606
|
+
# define XXH_FALLTHROUGH [[fallthrough]]
|
607
|
+
# endif
|
608
|
+
|
609
|
+
#elif defined(__cplusplus) && defined(__has_cpp_attribute)
|
610
|
+
# if __has_cpp_attribute(fallthrough)
|
611
|
+
# define XXH_FALLTHROUGH [[fallthrough]]
|
612
|
+
# endif
|
613
|
+
#endif
|
614
|
+
|
615
|
+
#ifndef XXH_FALLTHROUGH
|
616
|
+
# if defined(__GNUC__) && __GNUC__ >= 7
|
617
|
+
# define XXH_FALLTHROUGH __attribute__ ((fallthrough))
|
618
|
+
# elif defined(__clang__) && (__clang_major__ >= 10) \
|
619
|
+
&& (!defined(__APPLE__) || (__clang_major__ >= 12))
|
620
|
+
/* Apple clang 12 is effectively clang-10 ,
|
621
|
+
* see https://en.wikipedia.org/wiki/Xcode for details
|
622
|
+
*/
|
623
|
+
# define XXH_FALLTHROUGH __attribute__ ((fallthrough))
|
624
|
+
# else
|
625
|
+
# define XXH_FALLTHROUGH
|
626
|
+
# endif
|
627
|
+
#endif
|
628
|
+
|
546
629
|
/*!
|
547
630
|
* @}
|
548
631
|
* @ingroup public
|
@@ -915,9 +998,12 @@ struct XXH64_state_s {
|
|
915
998
|
XXH64_hash_t reserved64; /*!< Reserved field. Do not read or write to it, it may be removed. */
|
916
999
|
}; /* typedef'd to XXH64_state_t */
|
917
1000
|
|
918
|
-
#if defined
|
1001
|
+
#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* >= C11 */
|
919
1002
|
# include <stdalign.h>
|
920
1003
|
# define XXH_ALIGN(n) alignas(n)
|
1004
|
+
#elif defined(__cplusplus) && (__cplusplus >= 201103L) /* >= C++11 */
|
1005
|
+
/* In C++ alignas() is a keyword */
|
1006
|
+
# define XXH_ALIGN(n) alignas(n)
|
921
1007
|
#elif defined(__GNUC__)
|
922
1008
|
# define XXH_ALIGN(n) __attribute__ ((aligned(n)))
|
923
1009
|
#elif defined(_MSC_VER)
|
@@ -928,6 +1014,7 @@ struct XXH64_state_s {
|
|
928
1014
|
|
929
1015
|
/* Old GCC versions only accept the attribute after the type in structures. */
|
930
1016
|
#if !(defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)) /* C11+ */ \
|
1017
|
+
&& ! (defined(__cplusplus) && (__cplusplus >= 201103L)) /* >= C++11 */ \
|
931
1018
|
&& defined(__GNUC__)
|
932
1019
|
# define XXH_ALIGN_MEMBER(align, type) type XXH_ALIGN(align)
|
933
1020
|
#else
|
@@ -957,16 +1044,18 @@ struct XXH64_state_s {
|
|
957
1044
|
* @brief Structure for XXH3 streaming API.
|
958
1045
|
*
|
959
1046
|
* @note This is only defined when @ref XXH_STATIC_LINKING_ONLY,
|
960
|
-
* @ref XXH_INLINE_ALL, or @ref XXH_IMPLEMENTATION is defined.
|
961
|
-
* an opaque type.
|
1047
|
+
* @ref XXH_INLINE_ALL, or @ref XXH_IMPLEMENTATION is defined.
|
1048
|
+
* Otherwise it is an opaque type.
|
1049
|
+
* Never use this definition in combination with dynamic library.
|
1050
|
+
* This allows fields to safely be changed in the future.
|
962
1051
|
*
|
963
|
-
* @note **This structure has a strict alignment requirement of 64 bytes
|
964
|
-
* not allocate this with `malloc()` or `new`,
|
965
|
-
*
|
966
|
-
* allocation.
|
1052
|
+
* @note ** This structure has a strict alignment requirement of 64 bytes!! **
|
1053
|
+
* Do not allocate this with `malloc()` or `new`,
|
1054
|
+
* it will not be sufficiently aligned.
|
1055
|
+
* Use @ref XXH3_createState() and @ref XXH3_freeState(), or stack allocation.
|
967
1056
|
*
|
968
1057
|
* Typedef'd to @ref XXH3_state_t.
|
969
|
-
* Do
|
1058
|
+
* Do never access the members of this struct directly.
|
970
1059
|
*
|
971
1060
|
* @see XXH3_INITSTATE() for stack initialization.
|
972
1061
|
* @see XXH3_createState(), XXH3_freeState().
|
@@ -1227,13 +1316,13 @@ XXH_PUBLIC_API XXH128_hash_t XXH128(const void* data, size_t len, XXH64_hash_t s
|
|
1227
1316
|
|
1228
1317
|
/*!
|
1229
1318
|
* @def XXH_REROLL
|
1230
|
-
* @brief Whether to reroll `XXH32_finalize
|
1319
|
+
* @brief Whether to reroll `XXH32_finalize`.
|
1231
1320
|
*
|
1232
|
-
* For performance, `XXH32_finalize`
|
1321
|
+
* For performance, `XXH32_finalize` uses an unrolled loop
|
1233
1322
|
* in the form of a switch statement.
|
1234
1323
|
*
|
1235
|
-
* This is not always desirable, as it generates larger code,
|
1236
|
-
* the architecture, may even be slower
|
1324
|
+
* This is not always desirable, as it generates larger code,
|
1325
|
+
* and depending on the architecture, may even be slower
|
1237
1326
|
*
|
1238
1327
|
* This is automatically defined with `-Os`/`-Oz` on GCC and Clang.
|
1239
1328
|
*/
|
@@ -1254,10 +1343,21 @@ XXH_PUBLIC_API XXH128_hash_t XXH128(const void* data, size_t len, XXH64_hash_t s
|
|
1254
1343
|
*/
|
1255
1344
|
|
1256
1345
|
#ifndef XXH_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */
|
1257
|
-
/* prefer __packed__ structures (method 1) for gcc on armv7 and
|
1258
|
-
# if !defined(__clang__) &&
|
1346
|
+
/* prefer __packed__ structures (method 1) for gcc on armv7+ and mips */
|
1347
|
+
# if !defined(__clang__) && \
|
1348
|
+
( \
|
1259
1349
|
(defined(__INTEL_COMPILER) && !defined(_WIN32)) || \
|
1260
|
-
(
|
1350
|
+
( \
|
1351
|
+
defined(__GNUC__) && ( \
|
1352
|
+
(defined(__ARM_ARCH) && __ARM_ARCH >= 7) || \
|
1353
|
+
( \
|
1354
|
+
defined(__mips__) && \
|
1355
|
+
(__mips <= 5 || __mips_isa_rev < 6) && \
|
1356
|
+
(!defined(__mips16) || defined(__mips_mips16e2)) \
|
1357
|
+
) \
|
1358
|
+
) \
|
1359
|
+
) \
|
1360
|
+
)
|
1261
1361
|
# define XXH_FORCE_MEMORY_ACCESS 1
|
1262
1362
|
# endif
|
1263
1363
|
#endif
|
@@ -1285,7 +1385,9 @@ XXH_PUBLIC_API XXH128_hash_t XXH128(const void* data, size_t len, XXH64_hash_t s
|
|
1285
1385
|
#endif
|
1286
1386
|
|
1287
1387
|
#ifndef XXH_REROLL
|
1288
|
-
# if defined(__OPTIMIZE_SIZE__)
|
1388
|
+
# if defined(__OPTIMIZE_SIZE__) /* -Os, -Oz */ || \
|
1389
|
+
(defined(__GNUC__) && !defined(__clang__))
|
1390
|
+
/* The if/then loop is preferable to switch/case on gcc (on x64) */
|
1289
1391
|
# define XXH_REROLL 1
|
1290
1392
|
# else
|
1291
1393
|
# define XXH_REROLL 0
|
@@ -1311,13 +1413,13 @@ XXH_PUBLIC_API XXH128_hash_t XXH128(const void* data, size_t len, XXH64_hash_t s
|
|
1311
1413
|
* @internal
|
1312
1414
|
* @brief Modify this function to use a different routine than malloc().
|
1313
1415
|
*/
|
1314
|
-
static void* XXH_malloc(size_t s) { return
|
1416
|
+
static void* XXH_malloc(size_t s) { return malloc(s); }
|
1315
1417
|
|
1316
1418
|
/*!
|
1317
1419
|
* @internal
|
1318
1420
|
* @brief Modify this function to use a different routine than free().
|
1319
1421
|
*/
|
1320
|
-
static void XXH_free(void* p) {
|
1422
|
+
static void XXH_free(void* p) { free(p); }
|
1321
1423
|
|
1322
1424
|
#include <string.h>
|
1323
1425
|
|
@@ -1392,7 +1494,17 @@ static void* XXH_memcpy(void* dest, const void* src, size_t size)
|
|
1392
1494
|
#endif
|
1393
1495
|
|
1394
1496
|
/* note: use after variable declarations */
|
1395
|
-
#
|
1497
|
+
#ifndef XXH_STATIC_ASSERT
|
1498
|
+
# if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* C11 */
|
1499
|
+
# include <assert.h>
|
1500
|
+
# define XXH_STATIC_ASSERT_WITH_MESSAGE(c,m) do { static_assert((c),m); } while(0)
|
1501
|
+
# elif defined(__cplusplus) && (__cplusplus >= 201103L) /* C++11 */
|
1502
|
+
# define XXH_STATIC_ASSERT_WITH_MESSAGE(c,m) do { static_assert((c),m); } while(0)
|
1503
|
+
# else
|
1504
|
+
# define XXH_STATIC_ASSERT_WITH_MESSAGE(c,m) do { struct xxh_sa { char x[(c) ? 1 : -1]; }; } while(0)
|
1505
|
+
# endif
|
1506
|
+
# define XXH_STATIC_ASSERT(c) XXH_STATIC_ASSERT_WITH_MESSAGE((c),#c)
|
1507
|
+
#endif
|
1396
1508
|
|
1397
1509
|
/*!
|
1398
1510
|
* @internal
|
@@ -1534,7 +1646,6 @@ static xxh_u32 XXH_read32(const void* memPtr)
|
|
1534
1646
|
|
1535
1647
|
|
1536
1648
|
/* *** Endianness *** */
|
1537
|
-
typedef enum { XXH_bigEndian=0, XXH_littleEndian=1 } XXH_endianess;
|
1538
1649
|
|
1539
1650
|
/*!
|
1540
1651
|
* @ingroup tuning
|
@@ -1544,8 +1655,8 @@ typedef enum { XXH_bigEndian=0, XXH_littleEndian=1 } XXH_endianess;
|
|
1544
1655
|
* Defined to 1 if the target is little endian, or 0 if it is big endian.
|
1545
1656
|
* It can be defined externally, for example on the compiler command line.
|
1546
1657
|
*
|
1547
|
-
* If it is not defined,
|
1548
|
-
* is used instead.
|
1658
|
+
* If it is not defined,
|
1659
|
+
* a runtime check (which is usually constant folded) is used instead.
|
1549
1660
|
*
|
1550
1661
|
* @note
|
1551
1662
|
* This is not necessarily defined to an integer constant.
|
@@ -1859,41 +1970,41 @@ XXH32_finalize(xxh_u32 h32, const xxh_u8* ptr, size_t len, XXH_alignment align)
|
|
1859
1970
|
} else {
|
1860
1971
|
switch(len&15) /* or switch(bEnd - p) */ {
|
1861
1972
|
case 12: XXH_PROCESS4;
|
1862
|
-
|
1973
|
+
XXH_FALLTHROUGH;
|
1863
1974
|
case 8: XXH_PROCESS4;
|
1864
|
-
|
1975
|
+
XXH_FALLTHROUGH;
|
1865
1976
|
case 4: XXH_PROCESS4;
|
1866
1977
|
return XXH32_avalanche(h32);
|
1867
1978
|
|
1868
1979
|
case 13: XXH_PROCESS4;
|
1869
|
-
|
1980
|
+
XXH_FALLTHROUGH;
|
1870
1981
|
case 9: XXH_PROCESS4;
|
1871
|
-
|
1982
|
+
XXH_FALLTHROUGH;
|
1872
1983
|
case 5: XXH_PROCESS4;
|
1873
1984
|
XXH_PROCESS1;
|
1874
1985
|
return XXH32_avalanche(h32);
|
1875
1986
|
|
1876
1987
|
case 14: XXH_PROCESS4;
|
1877
|
-
|
1988
|
+
XXH_FALLTHROUGH;
|
1878
1989
|
case 10: XXH_PROCESS4;
|
1879
|
-
|
1990
|
+
XXH_FALLTHROUGH;
|
1880
1991
|
case 6: XXH_PROCESS4;
|
1881
1992
|
XXH_PROCESS1;
|
1882
1993
|
XXH_PROCESS1;
|
1883
1994
|
return XXH32_avalanche(h32);
|
1884
1995
|
|
1885
1996
|
case 15: XXH_PROCESS4;
|
1886
|
-
|
1997
|
+
XXH_FALLTHROUGH;
|
1887
1998
|
case 11: XXH_PROCESS4;
|
1888
|
-
|
1999
|
+
XXH_FALLTHROUGH;
|
1889
2000
|
case 7: XXH_PROCESS4;
|
1890
|
-
|
2001
|
+
XXH_FALLTHROUGH;
|
1891
2002
|
case 3: XXH_PROCESS1;
|
1892
|
-
|
2003
|
+
XXH_FALLTHROUGH;
|
1893
2004
|
case 2: XXH_PROCESS1;
|
1894
|
-
|
2005
|
+
XXH_FALLTHROUGH;
|
1895
2006
|
case 1: XXH_PROCESS1;
|
1896
|
-
|
2007
|
+
XXH_FALLTHROUGH;
|
1897
2008
|
case 0: return XXH32_avalanche(h32);
|
1898
2009
|
}
|
1899
2010
|
XXH_ASSERT(0);
|
@@ -1920,7 +2031,7 @@ XXH32_finalize(xxh_u32 h32, const xxh_u8* ptr, size_t len, XXH_alignment align)
|
|
1920
2031
|
XXH_FORCE_INLINE xxh_u32
|
1921
2032
|
XXH32_endian_align(const xxh_u8* input, size_t len, xxh_u32 seed, XXH_alignment align)
|
1922
2033
|
{
|
1923
|
-
const xxh_u8* bEnd = input + len;
|
2034
|
+
const xxh_u8* bEnd = input ? input + len : NULL;
|
1924
2035
|
xxh_u32 h32;
|
1925
2036
|
|
1926
2037
|
#if defined(XXH_ACCEPT_NULL_INPUT_POINTER) && (XXH_ACCEPT_NULL_INPUT_POINTER>=1)
|
@@ -2348,7 +2459,7 @@ XXH64_finalize(xxh_u64 h64, const xxh_u8* ptr, size_t len, XXH_alignment align)
|
|
2348
2459
|
XXH_FORCE_INLINE xxh_u64
|
2349
2460
|
XXH64_endian_align(const xxh_u8* input, size_t len, xxh_u64 seed, XXH_alignment align)
|
2350
2461
|
{
|
2351
|
-
const xxh_u8* bEnd = input + len;
|
2462
|
+
const xxh_u8* bEnd = input ? input + len : NULL;
|
2352
2463
|
xxh_u64 h64;
|
2353
2464
|
|
2354
2465
|
#if defined(XXH_ACCEPT_NULL_INPUT_POINTER) && (XXH_ACCEPT_NULL_INPUT_POINTER>=1)
|
@@ -3341,7 +3452,7 @@ XXH3_len_9to16_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_
|
|
3341
3452
|
{
|
3342
3453
|
XXH_ASSERT(input != NULL);
|
3343
3454
|
XXH_ASSERT(secret != NULL);
|
3344
|
-
XXH_ASSERT(
|
3455
|
+
XXH_ASSERT(9 <= len && len <= 16);
|
3345
3456
|
{ xxh_u64 const bitflip1 = (XXH_readLE64(secret+24) ^ XXH_readLE64(secret+32)) + seed;
|
3346
3457
|
xxh_u64 const bitflip2 = (XXH_readLE64(secret+40) ^ XXH_readLE64(secret+48)) - seed;
|
3347
3458
|
xxh_u64 const input_lo = XXH_readLE64(input) ^ bitflip1;
|
@@ -3649,17 +3760,19 @@ XXH3_initCustomSecret_avx512(void* XXH_RESTRICT customSecret, xxh_u64 seed64)
|
|
3649
3760
|
XXH_ASSERT(((size_t)customSecret & 63) == 0);
|
3650
3761
|
(void)(&XXH_writeLE64);
|
3651
3762
|
{ int const nbRounds = XXH_SECRET_DEFAULT_SIZE / sizeof(__m512i);
|
3652
|
-
__m512i const seed = _mm512_mask_set1_epi64(_mm512_set1_epi64((xxh_i64)seed64), 0xAA,
|
3763
|
+
__m512i const seed = _mm512_mask_set1_epi64(_mm512_set1_epi64((xxh_i64)seed64), 0xAA, (xxh_i64)(0U - seed64));
|
3653
3764
|
|
3654
|
-
|
3655
|
-
|
3765
|
+
const __m512i* const src = (const __m512i*) ((const void*) XXH3_kSecret);
|
3766
|
+
__m512i* const dest = ( __m512i*) customSecret;
|
3656
3767
|
int i;
|
3768
|
+
XXH_ASSERT(((size_t)src & 63) == 0); /* control alignment */
|
3769
|
+
XXH_ASSERT(((size_t)dest & 63) == 0);
|
3657
3770
|
for (i=0; i < nbRounds; ++i) {
|
3658
3771
|
/* GCC has a bug, _mm512_stream_load_si512 accepts 'void*', not 'void const*',
|
3659
|
-
* this will warn "discards
|
3772
|
+
* this will warn "discards 'const' qualifier". */
|
3660
3773
|
union {
|
3661
|
-
|
3662
|
-
|
3774
|
+
const __m512i* cp;
|
3775
|
+
void* p;
|
3663
3776
|
} remote_const_void;
|
3664
3777
|
remote_const_void.cp = src + i;
|
3665
3778
|
dest[i] = _mm512_add_epi64(_mm512_stream_load_si512(remote_const_void.p), seed);
|
@@ -3745,10 +3858,10 @@ XXH_FORCE_INLINE XXH_TARGET_AVX2 void XXH3_initCustomSecret_avx2(void* XXH_RESTR
|
|
3745
3858
|
XXH_STATIC_ASSERT(XXH_SEC_ALIGN <= 64);
|
3746
3859
|
(void)(&XXH_writeLE64);
|
3747
3860
|
XXH_PREFETCH(customSecret);
|
3748
|
-
{ __m256i const seed = _mm256_set_epi64x(
|
3861
|
+
{ __m256i const seed = _mm256_set_epi64x((xxh_i64)(0U - seed64), (xxh_i64)seed64, (xxh_i64)(0U - seed64), (xxh_i64)seed64);
|
3749
3862
|
|
3750
|
-
|
3751
|
-
|
3863
|
+
const __m256i* const src = (const __m256i*) ((const void*) XXH3_kSecret);
|
3864
|
+
__m256i* dest = ( __m256i*) customSecret;
|
3752
3865
|
|
3753
3866
|
# if defined(__GNUC__) || defined(__clang__)
|
3754
3867
|
/*
|
@@ -3758,6 +3871,8 @@ XXH_FORCE_INLINE XXH_TARGET_AVX2 void XXH3_initCustomSecret_avx2(void* XXH_RESTR
|
|
3758
3871
|
*/
|
3759
3872
|
XXH_COMPILER_GUARD(dest);
|
3760
3873
|
# endif
|
3874
|
+
XXH_ASSERT(((size_t)src & 31) == 0); /* control alignment */
|
3875
|
+
XXH_ASSERT(((size_t)dest & 31) == 0);
|
3761
3876
|
|
3762
3877
|
/* GCC -O2 need unroll loop manually */
|
3763
3878
|
dest[0] = _mm256_add_epi64(_mm256_stream_load_si256(src+0), seed);
|
@@ -3849,27 +3964,29 @@ XXH_FORCE_INLINE XXH_TARGET_SSE2 void XXH3_initCustomSecret_sse2(void* XXH_RESTR
|
|
3849
3964
|
{ int const nbRounds = XXH_SECRET_DEFAULT_SIZE / sizeof(__m128i);
|
3850
3965
|
|
3851
3966
|
# if defined(_MSC_VER) && defined(_M_IX86) && _MSC_VER < 1900
|
3852
|
-
|
3853
|
-
XXH_ALIGN(16) const xxh_i64 seed64x2[2] = { (xxh_i64)seed64,
|
3967
|
+
/* MSVC 32bit mode does not support _mm_set_epi64x before 2015 */
|
3968
|
+
XXH_ALIGN(16) const xxh_i64 seed64x2[2] = { (xxh_i64)seed64, (xxh_i64)(0U - seed64) };
|
3854
3969
|
__m128i const seed = _mm_load_si128((__m128i const*)seed64x2);
|
3855
3970
|
# else
|
3856
|
-
__m128i const seed = _mm_set_epi64x(
|
3971
|
+
__m128i const seed = _mm_set_epi64x((xxh_i64)(0U - seed64), (xxh_i64)seed64);
|
3857
3972
|
# endif
|
3858
3973
|
int i;
|
3859
3974
|
|
3860
|
-
|
3861
|
-
|
3975
|
+
const void* const src16 = XXH3_kSecret;
|
3976
|
+
__m128i* dst16 = (__m128i*) customSecret;
|
3862
3977
|
# if defined(__GNUC__) || defined(__clang__)
|
3863
3978
|
/*
|
3864
3979
|
* On GCC & Clang, marking 'dest' as modified will cause the compiler:
|
3865
3980
|
* - do not extract the secret from sse registers in the internal loop
|
3866
3981
|
* - use less common registers, and avoid pushing these reg into stack
|
3867
3982
|
*/
|
3868
|
-
XXH_COMPILER_GUARD(
|
3983
|
+
XXH_COMPILER_GUARD(dst16);
|
3869
3984
|
# endif
|
3985
|
+
XXH_ASSERT(((size_t)src16 & 15) == 0); /* control alignment */
|
3986
|
+
XXH_ASSERT(((size_t)dst16 & 15) == 0);
|
3870
3987
|
|
3871
3988
|
for (i=0; i < nbRounds; ++i) {
|
3872
|
-
|
3989
|
+
dst16[i] = _mm_add_epi64(_mm_load_si128((const __m128i *)src16+i), seed);
|
3873
3990
|
} }
|
3874
3991
|
}
|
3875
3992
|
|
@@ -4645,7 +4762,7 @@ XXH3_update(XXH3_state_t* state,
|
|
4645
4762
|
XXH_ASSERT(input < bEnd);
|
4646
4763
|
|
4647
4764
|
/* Consume input by a multiple of internal buffer size */
|
4648
|
-
if (input
|
4765
|
+
if (bEnd - input > XXH3_INTERNALBUFFER_SIZE) {
|
4649
4766
|
const xxh_u8* const limit = bEnd - XXH3_INTERNALBUFFER_SIZE;
|
4650
4767
|
do {
|
4651
4768
|
XXH3_consumeStripes(state->acc,
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: digest-xxhash
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- konsolebox
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-08-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|