digest-xxhash 0.2.6 → 0.2.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0d340515d2a46b42bc5c332465a18de3bac90949c8e4d694a040b537d47bf742
4
- data.tar.gz: 347fd239d94cb06cef8760e6f9146b4c7aaa70032ae74005cb2f81ba703e3217
3
+ metadata.gz: cc8fa50a282d7bddfbb1b95d0ec455d342480915a00b1c594c60a4ae74ab36cc
4
+ data.tar.gz: 89fdada3a2405d8862541e50463ea3a47b383558ecf02b0fc9e3ce720b750d4a
5
5
  SHA512:
6
- metadata.gz: e15847af311052541303513833fb79881e4798a3fac0127b26a41bce200e6f8c141dae525c93746710da1d0b5977e7fbce03302f74c8d88181a0d24215c3fa71
7
- data.tar.gz: 361d7b1e29837803ade9545a4c9f86f01275d4b21680a69a3f154d1849b6d31bd5d80f4ff3c291e1d74bab0b1be28e66ee1f9380f040b7570e85124744d6548b
6
+ metadata.gz: 5b4f1cd43dc3c185447e1a36088b58e3f98bdb1f254e28d35748a4c5c8145844b8285449f23f74ae9a83c7bd36f303093f178c7d46219da1cb527a939813f412
7
+ data.tar.gz: e5658576392817568d19da3c342eb12b61cd0ff60e3d20bf4514d2557570a29faf654d48ee7f0ec7f96447a396131ac81346a1d3325fd325b083b1a0d9c5bfb6
@@ -43,7 +43,7 @@ Gem::Specification.new do |spec|
43
43
  spec.require_paths = ["lib"]
44
44
 
45
45
  spec.add_development_dependency "rake"
46
- spec.add_development_dependency "rake-compiler", "~> 1.0", "!= 1.1.3", "!= 1.1.4", "!= 1.1.5"
46
+ spec.add_development_dependency "rake-compiler", "~> 1.2", ">= 1.2.3"
47
47
  spec.add_development_dependency "minitest", "~> 5.8"
48
48
 
49
49
  spec.extensions = %w[ext/digest/xxhash/extconf.rb]
@@ -642,8 +642,6 @@ static VALUE _Digest_XXH64_reset(int argc, VALUE* argv, VALUE self)
642
642
 
643
643
  break;
644
644
  case T_FIXNUM:
645
- _xxh64_reset(_get_state_xxh64(self), FIX2UINT(seed));
646
- break;
647
645
  case T_BIGNUM:
648
646
  _xxh64_reset(_get_state_xxh64(self), NUM2ULL(seed));
649
647
  break;
@@ -795,8 +793,6 @@ static VALUE _Digest_XXH3_64bits_reset(int argc, VALUE* argv, VALUE self)
795
793
 
796
794
  break;
797
795
  case T_FIXNUM:
798
- _xxh3_64bits_reset(_get_state_xxh3_64bits(self), FIX2UINT(seed));
799
- break;
800
796
  case T_BIGNUM:
801
797
  _xxh3_64bits_reset(_get_state_xxh3_64bits(self), NUM2ULL(seed));
802
798
  break;
@@ -982,8 +978,6 @@ static VALUE _Digest_XXH3_128bits_reset(int argc, VALUE* argv, VALUE self)
982
978
 
983
979
  break;
984
980
  case T_FIXNUM:
985
- _xxh3_128bits_reset(_get_state_xxh3_128bits(self), FIX2UINT(seed));
986
- break;
987
981
  case T_BIGNUM:
988
982
  _xxh3_128bits_reset(_get_state_xxh3_128bits(self), NUM2ULL(seed));
989
983
  break;
@@ -182,6 +182,33 @@ extern "C" {
182
182
  * @{
183
183
  */
184
184
  #ifdef XXH_DOXYGEN
185
+ /*!
186
+ * @brief Gives access to internal state declaration, required for static allocation.
187
+ *
188
+ * Incompatible with dynamic linking, due to risks of ABI changes.
189
+ *
190
+ * Usage:
191
+ * @code{.c}
192
+ * #define XXH_STATIC_LINKING_ONLY
193
+ * #include "xxhash.h"
194
+ * @endcode
195
+ */
196
+ # define XXH_STATIC_LINKING_ONLY
197
+ /* Do not undef XXH_STATIC_LINKING_ONLY for Doxygen */
198
+
199
+ /*!
200
+ * @brief Gives access to internal definitions.
201
+ *
202
+ * Usage:
203
+ * @code{.c}
204
+ * #define XXH_STATIC_LINKING_ONLY
205
+ * #define XXH_IMPLEMENTATION
206
+ * #include "xxhash.h"
207
+ * @endcode
208
+ */
209
+ # define XXH_IMPLEMENTATION
210
+ /* Do not undef XXH_IMPLEMENTATION for Doxygen */
211
+
185
212
  /*!
186
213
  * @brief Exposes the implementation and marks all functions as `inline`.
187
214
  *
@@ -448,7 +475,7 @@ extern "C" {
448
475
  ***************************************/
449
476
  #define XXH_VERSION_MAJOR 0
450
477
  #define XXH_VERSION_MINOR 8
451
- #define XXH_VERSION_RELEASE 1
478
+ #define XXH_VERSION_RELEASE 2
452
479
  /*! @brief Version number, encoded as two digits each */
453
480
  #define XXH_VERSION_NUMBER (XXH_VERSION_MAJOR *100*100 + XXH_VERSION_MINOR *100 + XXH_VERSION_RELEASE)
454
481
 
@@ -710,32 +737,41 @@ XXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t
710
737
  XXH_PUBLIC_API XXH_PUREF XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src);
711
738
 
712
739
 
740
+ /*! @cond Doxygen ignores this part */
713
741
  #ifdef __has_attribute
714
742
  # define XXH_HAS_ATTRIBUTE(x) __has_attribute(x)
715
743
  #else
716
744
  # define XXH_HAS_ATTRIBUTE(x) 0
717
745
  #endif
746
+ /*! @endcond */
718
747
 
748
+ /*! @cond Doxygen ignores this part */
719
749
  /*
720
750
  * C23 __STDC_VERSION__ number hasn't been specified yet. For now
721
751
  * leave as `201711L` (C17 + 1).
722
752
  * TODO: Update to correct value when its been specified.
723
753
  */
724
754
  #define XXH_C23_VN 201711L
755
+ /*! @endcond */
725
756
 
757
+ /*! @cond Doxygen ignores this part */
726
758
  /* C-language Attributes are added in C23. */
727
759
  #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= XXH_C23_VN) && defined(__has_c_attribute)
728
760
  # define XXH_HAS_C_ATTRIBUTE(x) __has_c_attribute(x)
729
761
  #else
730
762
  # define XXH_HAS_C_ATTRIBUTE(x) 0
731
763
  #endif
764
+ /*! @endcond */
732
765
 
766
+ /*! @cond Doxygen ignores this part */
733
767
  #if defined(__cplusplus) && defined(__has_cpp_attribute)
734
768
  # define XXH_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x)
735
769
  #else
736
770
  # define XXH_HAS_CPP_ATTRIBUTE(x) 0
737
771
  #endif
772
+ /*! @endcond */
738
773
 
774
+ /*! @cond Doxygen ignores this part */
739
775
  /*
740
776
  * Define XXH_FALLTHROUGH macro for annotating switch case with the 'fallthrough' attribute
741
777
  * introduced in CPP17 and C23.
@@ -749,7 +785,9 @@ XXH_PUBLIC_API XXH_PUREF XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canoni
749
785
  #else
750
786
  # define XXH_FALLTHROUGH /* fallthrough */
751
787
  #endif
788
+ /*! @endcond */
752
789
 
790
+ /*! @cond Doxygen ignores this part */
753
791
  /*
754
792
  * Define XXH_NOESCAPE for annotated pointers in public API.
755
793
  * https://clang.llvm.org/docs/AttributeReference.html#noescape
@@ -760,6 +798,7 @@ XXH_PUBLIC_API XXH_PUREF XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canoni
760
798
  #else
761
799
  # define XXH_NOESCAPE
762
800
  #endif
801
+ /*! @endcond */
763
802
 
764
803
 
765
804
  /*!
@@ -842,17 +881,113 @@ XXH_PUBLIC_API XXH_PUREF XXH64_hash_t XXH64(XXH_NOESCAPE const void* input, size
842
881
  * @see XXH64_state_s for details.
843
882
  */
844
883
  typedef struct XXH64_state_s XXH64_state_t; /* incomplete type */
884
+
885
+ /*!
886
+ * @brief Allocates an @ref XXH64_state_t.
887
+ *
888
+ * Must be freed with XXH64_freeState().
889
+ * @return An allocated XXH64_state_t on success, `NULL` on failure.
890
+ */
845
891
  XXH_PUBLIC_API XXH_MALLOCF XXH64_state_t* XXH64_createState(void);
892
+
893
+ /*!
894
+ * @brief Frees an @ref XXH64_state_t.
895
+ *
896
+ * Must be allocated with XXH64_createState().
897
+ * @param statePtr A pointer to an @ref XXH64_state_t allocated with @ref XXH64_createState().
898
+ * @return XXH_OK.
899
+ */
846
900
  XXH_PUBLIC_API XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr);
901
+
902
+ /*!
903
+ * @brief Copies one @ref XXH64_state_t to another.
904
+ *
905
+ * @param dst_state The state to copy to.
906
+ * @param src_state The state to copy from.
907
+ * @pre
908
+ * @p dst_state and @p src_state must not be `NULL` and must not overlap.
909
+ */
847
910
  XXH_PUBLIC_API void XXH64_copyState(XXH_NOESCAPE XXH64_state_t* dst_state, const XXH64_state_t* src_state);
848
911
 
912
+ /*!
913
+ * @brief Resets an @ref XXH64_state_t to begin a new hash.
914
+ *
915
+ * This function resets and seeds a state. Call it before @ref XXH64_update().
916
+ *
917
+ * @param statePtr The state struct to reset.
918
+ * @param seed The 64-bit seed to alter the hash result predictably.
919
+ *
920
+ * @pre
921
+ * @p statePtr must not be `NULL`.
922
+ *
923
+ * @return @ref XXH_OK on success, @ref XXH_ERROR on failure.
924
+ */
849
925
  XXH_PUBLIC_API XXH_errorcode XXH64_reset (XXH_NOESCAPE XXH64_state_t* statePtr, XXH64_hash_t seed);
926
+
927
+ /*!
928
+ * @brief Consumes a block of @p input to an @ref XXH64_state_t.
929
+ *
930
+ * Call this to incrementally consume blocks of data.
931
+ *
932
+ * @param statePtr The state struct to update.
933
+ * @param input The block of data to be hashed, at least @p length bytes in size.
934
+ * @param length The length of @p input, in bytes.
935
+ *
936
+ * @pre
937
+ * @p statePtr must not be `NULL`.
938
+ * @pre
939
+ * The memory between @p input and @p input + @p length must be valid,
940
+ * readable, contiguous memory. However, if @p length is `0`, @p input may be
941
+ * `NULL`. In C++, this also must be *TriviallyCopyable*.
942
+ *
943
+ * @return @ref XXH_OK on success, @ref XXH_ERROR on failure.
944
+ */
850
945
  XXH_PUBLIC_API XXH_errorcode XXH64_update (XXH_NOESCAPE XXH64_state_t* statePtr, XXH_NOESCAPE const void* input, size_t length);
946
+
947
+ /*!
948
+ * @brief Returns the calculated hash value from an @ref XXH64_state_t.
949
+ *
950
+ * @note
951
+ * Calling XXH64_digest() will not affect @p statePtr, so you can update,
952
+ * digest, and update again.
953
+ *
954
+ * @param statePtr The state struct to calculate the hash from.
955
+ *
956
+ * @pre
957
+ * @p statePtr must not be `NULL`.
958
+ *
959
+ * @return The calculated xxHash64 value from that state.
960
+ */
851
961
  XXH_PUBLIC_API XXH_PUREF XXH64_hash_t XXH64_digest (XXH_NOESCAPE const XXH64_state_t* statePtr);
852
962
  #endif /* !XXH_NO_STREAM */
853
963
  /******* Canonical representation *******/
964
+
965
+ /*!
966
+ * @brief Canonical (big endian) representation of @ref XXH64_hash_t.
967
+ */
854
968
  typedef struct { unsigned char digest[sizeof(XXH64_hash_t)]; } XXH64_canonical_t;
969
+
970
+ /*!
971
+ * @brief Converts an @ref XXH64_hash_t to a big endian @ref XXH64_canonical_t.
972
+ *
973
+ * @param dst The @ref XXH64_canonical_t pointer to be stored to.
974
+ * @param hash The @ref XXH64_hash_t to be converted.
975
+ *
976
+ * @pre
977
+ * @p dst must not be `NULL`.
978
+ */
855
979
  XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH_NOESCAPE XXH64_canonical_t* dst, XXH64_hash_t hash);
980
+
981
+ /*!
982
+ * @brief Converts an @ref XXH64_canonical_t to a native @ref XXH64_hash_t.
983
+ *
984
+ * @param src The @ref XXH64_canonical_t to convert.
985
+ *
986
+ * @pre
987
+ * @p src must not be `NULL`.
988
+ *
989
+ * @return The converted hash.
990
+ */
856
991
  XXH_PUBLIC_API XXH_PUREF XXH64_hash_t XXH64_hashFromCanonical(XXH_NOESCAPE const XXH64_canonical_t* src);
857
992
 
858
993
  #ifndef XXH_NO_XXH3
@@ -884,10 +1019,18 @@ XXH_PUBLIC_API XXH_PUREF XXH64_hash_t XXH64_hashFromCanonical(XXH_NOESCAPE const
884
1019
  * at competitive speeds, even without vector support. Further details are
885
1020
  * explained in the implementation.
886
1021
  *
887
- * Optimized implementations are provided for AVX512, AVX2, SSE2, NEON, POWER8,
888
- * ZVector and scalar targets. This can be controlled via the @ref XXH_VECTOR
889
- * macro. For the x86 family, an automatic dispatcher is included separately
890
- * in @ref xxh_x86dispatch.c.
1022
+ * XXH3 has a fast scalar implementation, but it also includes accelerated SIMD
1023
+ * implementations for many common platforms:
1024
+ * - AVX512
1025
+ * - AVX2
1026
+ * - SSE2
1027
+ * - ARM NEON
1028
+ * - WebAssembly SIMD128
1029
+ * - POWER8 VSX
1030
+ * - s390x ZVector
1031
+ * This can be controlled via the @ref XXH_VECTOR macro, but it automatically
1032
+ * selects the best version according to predefined macros. For the x86 family, an
1033
+ * automatic runtime dispatcher is included separately in @ref xxh_x86dispatch.c.
891
1034
  *
892
1035
  * XXH3 implementation is portable:
893
1036
  * it has a generic C90 formulation that can be compiled on any platform,
@@ -987,20 +1130,50 @@ XXH_PUBLIC_API XXH_PUREF XXH64_hash_t XXH3_64bits_withSecret(XXH_NOESCAPE const
987
1130
  typedef struct XXH3_state_s XXH3_state_t;
988
1131
  XXH_PUBLIC_API XXH_MALLOCF XXH3_state_t* XXH3_createState(void);
989
1132
  XXH_PUBLIC_API XXH_errorcode XXH3_freeState(XXH3_state_t* statePtr);
1133
+
1134
+ /*!
1135
+ * @brief Copies one @ref XXH3_state_t to another.
1136
+ *
1137
+ * @param dst_state The state to copy to.
1138
+ * @param src_state The state to copy from.
1139
+ * @pre
1140
+ * @p dst_state and @p src_state must not be `NULL` and must not overlap.
1141
+ */
990
1142
  XXH_PUBLIC_API void XXH3_copyState(XXH_NOESCAPE XXH3_state_t* dst_state, XXH_NOESCAPE const XXH3_state_t* src_state);
991
1143
 
992
- /*
993
- * XXH3_64bits_reset():
994
- * Initialize with default parameters.
995
- * digest will be equivalent to `XXH3_64bits()`.
1144
+ /*!
1145
+ * @brief Resets an @ref XXH3_state_t to begin a new hash.
1146
+ *
1147
+ * This function resets `statePtr` and generate a secret with default parameters. Call it before @ref XXH3_64bits_update().
1148
+ * Digest will be equivalent to `XXH3_64bits()`.
1149
+ *
1150
+ * @param statePtr The state struct to reset.
1151
+ *
1152
+ * @pre
1153
+ * @p statePtr must not be `NULL`.
1154
+ *
1155
+ * @return @ref XXH_OK on success, @ref XXH_ERROR on failure.
1156
+ *
996
1157
  */
997
1158
  XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset(XXH_NOESCAPE XXH3_state_t* statePtr);
998
- /*
999
- * XXH3_64bits_reset_withSeed():
1000
- * Generate a custom secret from `seed`, and store it into `statePtr`.
1001
- * digest will be equivalent to `XXH3_64bits_withSeed()`.
1159
+
1160
+ /*!
1161
+ * @brief Resets an @ref XXH3_state_t with 64-bit seed to begin a new hash.
1162
+ *
1163
+ * This function resets `statePtr` and generate a secret from `seed`. Call it before @ref XXH3_64bits_update().
1164
+ * Digest will be equivalent to `XXH3_64bits_withSeed()`.
1165
+ *
1166
+ * @param statePtr The state struct to reset.
1167
+ * @param seed The 64-bit seed to alter the state.
1168
+ *
1169
+ * @pre
1170
+ * @p statePtr must not be `NULL`.
1171
+ *
1172
+ * @return @ref XXH_OK on success, @ref XXH_ERROR on failure.
1173
+ *
1002
1174
  */
1003
1175
  XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset_withSeed(XXH_NOESCAPE XXH3_state_t* statePtr, XXH64_hash_t seed);
1176
+
1004
1177
  /*!
1005
1178
  * XXH3_64bits_reset_withSecret():
1006
1179
  * `secret` is referenced, it _must outlive_ the hash streaming session.
@@ -1012,7 +1185,40 @@ XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset_withSeed(XXH_NOESCAPE XXH3_state_
1012
1185
  */
1013
1186
  XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset_withSecret(XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NOESCAPE const void* secret, size_t secretSize);
1014
1187
 
1188
+ /*!
1189
+ * @brief Consumes a block of @p input to an @ref XXH3_state_t.
1190
+ *
1191
+ * Call this to incrementally consume blocks of data.
1192
+ *
1193
+ * @param statePtr The state struct to update.
1194
+ * @param input The block of data to be hashed, at least @p length bytes in size.
1195
+ * @param length The length of @p input, in bytes.
1196
+ *
1197
+ * @pre
1198
+ * @p statePtr must not be `NULL`.
1199
+ * @pre
1200
+ * The memory between @p input and @p input + @p length must be valid,
1201
+ * readable, contiguous memory. However, if @p length is `0`, @p input may be
1202
+ * `NULL`. In C++, this also must be *TriviallyCopyable*.
1203
+ *
1204
+ * @return @ref XXH_OK on success, @ref XXH_ERROR on failure.
1205
+ */
1015
1206
  XXH_PUBLIC_API XXH_errorcode XXH3_64bits_update (XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NOESCAPE const void* input, size_t length);
1207
+
1208
+ /*!
1209
+ * @brief Returns the calculated XXH3 64-bit hash value from an @ref XXH3_state_t.
1210
+ *
1211
+ * @note
1212
+ * Calling XXH3_64bits_digest() will not affect @p statePtr, so you can update,
1213
+ * digest, and update again.
1214
+ *
1215
+ * @param statePtr The state struct to calculate the hash from.
1216
+ *
1217
+ * @pre
1218
+ * @p statePtr must not be `NULL`.
1219
+ *
1220
+ * @return The calculated XXH3 64-bit hash value from that state.
1221
+ */
1016
1222
  XXH_PUBLIC_API XXH_PUREF XXH64_hash_t XXH3_64bits_digest (XXH_NOESCAPE const XXH3_state_t* statePtr);
1017
1223
  #endif /* !XXH_NO_STREAM */
1018
1224
 
@@ -1072,11 +1278,75 @@ XXH_PUBLIC_API XXH_PUREF XXH128_hash_t XXH3_128bits_withSecret(XXH_NOESCAPE cons
1072
1278
  * All reset and streaming functions have same meaning as their 64-bit counterpart.
1073
1279
  */
1074
1280
 
1281
+ /*!
1282
+ * @brief Resets an @ref XXH3_state_t to begin a new hash.
1283
+ *
1284
+ * This function resets `statePtr` and generate a secret with default parameters. Call it before @ref XXH3_128bits_update().
1285
+ * Digest will be equivalent to `XXH3_128bits()`.
1286
+ *
1287
+ * @param statePtr The state struct to reset.
1288
+ *
1289
+ * @pre
1290
+ * @p statePtr must not be `NULL`.
1291
+ *
1292
+ * @return @ref XXH_OK on success, @ref XXH_ERROR on failure.
1293
+ *
1294
+ */
1075
1295
  XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset(XXH_NOESCAPE XXH3_state_t* statePtr);
1296
+
1297
+ /*!
1298
+ * @brief Resets an @ref XXH3_state_t with 64-bit seed to begin a new hash.
1299
+ *
1300
+ * This function resets `statePtr` and generate a secret from `seed`. Call it before @ref XXH3_128bits_update().
1301
+ * Digest will be equivalent to `XXH3_128bits_withSeed()`.
1302
+ *
1303
+ * @param statePtr The state struct to reset.
1304
+ * @param seed The 64-bit seed to alter the state.
1305
+ *
1306
+ * @pre
1307
+ * @p statePtr must not be `NULL`.
1308
+ *
1309
+ * @return @ref XXH_OK on success, @ref XXH_ERROR on failure.
1310
+ *
1311
+ */
1076
1312
  XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset_withSeed(XXH_NOESCAPE XXH3_state_t* statePtr, XXH64_hash_t seed);
1313
+ /*! @brief Custom secret 128-bit variant of XXH3. @see XXH_64bits_reset_withSecret(). */
1077
1314
  XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset_withSecret(XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NOESCAPE const void* secret, size_t secretSize);
1078
1315
 
1316
+ /*!
1317
+ * @brief Consumes a block of @p input to an @ref XXH3_state_t.
1318
+ *
1319
+ * Call this to incrementally consume blocks of data.
1320
+ *
1321
+ * @param statePtr The state struct to update.
1322
+ * @param input The block of data to be hashed, at least @p length bytes in size.
1323
+ * @param length The length of @p input, in bytes.
1324
+ *
1325
+ * @pre
1326
+ * @p statePtr must not be `NULL`.
1327
+ * @pre
1328
+ * The memory between @p input and @p input + @p length must be valid,
1329
+ * readable, contiguous memory. However, if @p length is `0`, @p input may be
1330
+ * `NULL`. In C++, this also must be *TriviallyCopyable*.
1331
+ *
1332
+ * @return @ref XXH_OK on success, @ref XXH_ERROR on failure.
1333
+ */
1079
1334
  XXH_PUBLIC_API XXH_errorcode XXH3_128bits_update (XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NOESCAPE const void* input, size_t length);
1335
+
1336
+ /*!
1337
+ * @brief Returns the calculated XXH3 128-bit hash value from an @ref XXH3_state_t.
1338
+ *
1339
+ * @note
1340
+ * Calling XXH3_128bits_digest() will not affect @p statePtr, so you can update,
1341
+ * digest, and update again.
1342
+ *
1343
+ * @param statePtr The state struct to calculate the hash from.
1344
+ *
1345
+ * @pre
1346
+ * @p statePtr must not be `NULL`.
1347
+ *
1348
+ * @return The calculated XXH3 128-bit hash value from that state.
1349
+ */
1080
1350
  XXH_PUBLIC_API XXH_PUREF XXH128_hash_t XXH3_128bits_digest (XXH_NOESCAPE const XXH3_state_t* statePtr);
1081
1351
  #endif /* !XXH_NO_STREAM */
1082
1352
 
@@ -1103,7 +1373,29 @@ XXH_PUBLIC_API XXH_PUREF int XXH128_cmp(XXH_NOESCAPE const void* h128_1, XXH_NOE
1103
1373
 
1104
1374
  /******* Canonical representation *******/
1105
1375
  typedef struct { unsigned char digest[sizeof(XXH128_hash_t)]; } XXH128_canonical_t;
1376
+
1377
+
1378
+ /*!
1379
+ * @brief Converts an @ref XXH128_hash_t to a big endian @ref XXH128_canonical_t.
1380
+ *
1381
+ * @param dst The @ref XXH128_canonical_t pointer to be stored to.
1382
+ * @param hash The @ref XXH128_hash_t to be converted.
1383
+ *
1384
+ * @pre
1385
+ * @p dst must not be `NULL`.
1386
+ */
1106
1387
  XXH_PUBLIC_API void XXH128_canonicalFromHash(XXH_NOESCAPE XXH128_canonical_t* dst, XXH128_hash_t hash);
1388
+
1389
+ /*!
1390
+ * @brief Converts an @ref XXH128_canonical_t to a native @ref XXH128_hash_t.
1391
+ *
1392
+ * @param src The @ref XXH128_canonical_t to convert.
1393
+ *
1394
+ * @pre
1395
+ * @p src must not be `NULL`.
1396
+ *
1397
+ * @return The converted hash.
1398
+ */
1107
1399
  XXH_PUBLIC_API XXH_PUREF XXH128_hash_t XXH128_hashFromCanonical(XXH_NOESCAPE const XXH128_canonical_t* src);
1108
1400
 
1109
1401
 
@@ -1213,6 +1505,7 @@ struct XXH64_state_s {
1213
1505
  #define XXH3_INTERNALBUFFER_SIZE 256
1214
1506
 
1215
1507
  /*!
1508
+ * @internal
1216
1509
  * @brief Default size of the secret buffer (and @ref XXH3_kSecret).
1217
1510
  *
1218
1511
  * This is the size used in @ref XXH3_kSecret and the seeded functions.
@@ -1539,7 +1832,7 @@ XXH3_128bits_reset_withSecretandSeed(XXH_NOESCAPE XXH3_state_t* statePtr,
1539
1832
  * inline small `memcpy()` calls, and it might also be faster on big-endian
1540
1833
  * systems which lack a native byteswap instruction. However, some compilers
1541
1834
  * will emit literal byteshifts even if the target supports unaligned access.
1542
- * .
1835
+ *
1543
1836
  *
1544
1837
  * @warning
1545
1838
  * Methods 1 and 2 rely on implementation-defined behavior. Use these with
@@ -1858,7 +2151,11 @@ static void* XXH_memcpy(void* dest, const void* src, size_t size)
1858
2151
  # include <assert.h> /* note: can still be disabled with NDEBUG */
1859
2152
  # define XXH_ASSERT(c) assert(c)
1860
2153
  #else
1861
- # define XXH_ASSERT(c) XXH_ASSUME(c)
2154
+ # if defined(__INTEL_COMPILER)
2155
+ # define XXH_ASSERT(c) XXH_ASSUME((unsigned char) (c))
2156
+ # else
2157
+ # define XXH_ASSERT(c) XXH_ASSUME(c)
2158
+ # endif
1862
2159
  #endif
1863
2160
 
1864
2161
  /* note: use after variable declarations */
@@ -1895,10 +2192,12 @@ static void* XXH_memcpy(void* dest, const void* src, size_t size)
1895
2192
  # define XXH_COMPILER_GUARD(var) ((void)0)
1896
2193
  #endif
1897
2194
 
1898
- #if defined(__clang__)
1899
- # define XXH_COMPILER_GUARD_W(var) __asm__("" : "+w" (var))
2195
+ /* Specifically for NEON vectors which use the "w" constraint, on
2196
+ * Clang. */
2197
+ #if defined(__clang__) && defined(__ARM_ARCH) && !defined(__wasm__)
2198
+ # define XXH_COMPILER_GUARD_CLANG_NEON(var) __asm__("" : "+w" (var))
1900
2199
  #else
1901
- # define XXH_COMPILER_GUARD_W(var) ((void)0)
2200
+ # define XXH_COMPILER_GUARD_CLANG_NEON(var) ((void)0)
1902
2201
  #endif
1903
2202
 
1904
2203
  /* *************************************
@@ -1915,6 +2214,7 @@ static void* XXH_memcpy(void* dest, const void* src, size_t size)
1915
2214
  typedef XXH32_hash_t xxh_u32;
1916
2215
 
1917
2216
  #ifdef XXH_OLD_NAMES
2217
+ # warning "XXH_OLD_NAMES is planned to be removed starting v0.9. If the program depends on it, consider moving away from it by employing newer type names directly"
1918
2218
  # define BYTE xxh_u8
1919
2219
  # define U8 xxh_u8
1920
2220
  # define U32 xxh_u32
@@ -2287,7 +2587,7 @@ static xxh_u32 XXH32_round(xxh_u32 acc, xxh_u32 input)
2287
2587
  acc += input * XXH_PRIME32_2;
2288
2588
  acc = XXH_rotl32(acc, 13);
2289
2589
  acc *= XXH_PRIME32_1;
2290
- #if (defined(__SSE4_1__) || defined(__aarch64__)) && !defined(XXH_ENABLE_AUTOVECTORIZE)
2590
+ #if (defined(__SSE4_1__) || defined(__aarch64__) || defined(__wasm_simd128__)) && !defined(XXH_ENABLE_AUTOVECTORIZE)
2291
2591
  /*
2292
2592
  * UGLY HACK:
2293
2593
  * A compiler fence is the only thing that prevents GCC and Clang from
@@ -2320,6 +2620,9 @@ static xxh_u32 XXH32_round(xxh_u32 acc, xxh_u32 input)
2320
2620
  * This is also enabled on AArch64, as Clang is *very aggressive* in vectorizing
2321
2621
  * the loop. NEON is only faster on the A53, and with the newer cores, it is less
2322
2622
  * than half the speed.
2623
+ *
2624
+ * Additionally, this is used on WASM SIMD128 because it JITs to the same
2625
+ * SIMD instructions and has the same issue.
2323
2626
  */
2324
2627
  XXH_COMPILER_GUARD(acc);
2325
2628
  #endif
@@ -3111,13 +3414,22 @@ XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(XXH_NOESCAPE const XXH64_can
3111
3414
  # define XXH_unlikely(x) (x)
3112
3415
  #endif
3113
3416
 
3417
+ #ifndef XXH_HAS_INCLUDE
3418
+ # ifdef __has_include
3419
+ # define XXH_HAS_INCLUDE(x) __has_include(x)
3420
+ # else
3421
+ # define XXH_HAS_INCLUDE(x) 0
3422
+ # endif
3423
+ #endif
3424
+
3114
3425
  #if defined(__GNUC__) || defined(__clang__)
3115
3426
  # if defined(__ARM_FEATURE_SVE)
3116
3427
  # include <arm_sve.h>
3117
3428
  # endif
3118
3429
  # if defined(__ARM_NEON__) || defined(__ARM_NEON) \
3119
3430
  || (defined(_M_ARM) && _M_ARM >= 7) \
3120
- || defined(_M_ARM64) || defined(_M_ARM64EC)
3431
+ || defined(_M_ARM64) || defined(_M_ARM64EC) \
3432
+ || (defined(__wasm_simd128__) && XXH_HAS_INCLUDE(<arm_neon.h>)) /* WASM SIMD128 via SIMDe */
3121
3433
  # define inline __inline__ /* circumvent a clang bug */
3122
3434
  # include <arm_neon.h>
3123
3435
  # undef inline
@@ -3228,7 +3540,7 @@ XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(XXH_NOESCAPE const XXH64_can
3228
3540
  * Note that these are actually implemented as macros.
3229
3541
  *
3230
3542
  * If this is not defined, it is detected automatically.
3231
- * @ref XXH_X86DISPATCH overrides this.
3543
+ * internal macro XXH_X86DISPATCH overrides this.
3232
3544
  */
3233
3545
  enum XXH_VECTOR_TYPE /* fake enum */ {
3234
3546
  XXH_SCALAR = 0, /*!< Portable scalar version */
@@ -3240,7 +3552,11 @@ enum XXH_VECTOR_TYPE /* fake enum */ {
3240
3552
  */
3241
3553
  XXH_AVX2 = 2, /*!< AVX2 for Haswell and Bulldozer */
3242
3554
  XXH_AVX512 = 3, /*!< AVX512 for Skylake and Icelake */
3243
- XXH_NEON = 4, /*!< NEON for most ARMv7-A and all AArch64 */
3555
+ XXH_NEON = 4, /*!<
3556
+ * NEON for most ARMv7-A, all AArch64, and WASM SIMD128
3557
+ * via the SIMDeverywhere polyfill provided with the
3558
+ * Emscripten SDK.
3559
+ */
3244
3560
  XXH_VSX = 5, /*!< VSX and ZVector for POWER8/z13 (64-bit) */
3245
3561
  XXH_SVE = 6, /*!< SVE for some ARMv8-A and ARMv9-A */
3246
3562
  };
@@ -3273,6 +3589,7 @@ enum XXH_VECTOR_TYPE /* fake enum */ {
3273
3589
  # elif ( \
3274
3590
  defined(__ARM_NEON__) || defined(__ARM_NEON) /* gcc */ \
3275
3591
  || defined(_M_ARM) || defined(_M_ARM64) || defined(_M_ARM64EC) /* msvc */ \
3592
+ || (defined(__wasm_simd128__) && XXH_HAS_INCLUDE(<arm_neon.h>)) /* wasm simd128 via SIMDe */ \
3276
3593
  ) && ( \
3277
3594
  defined(_WIN32) || defined(__LITTLE_ENDIAN__) /* little endian only */ \
3278
3595
  || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) \
@@ -3478,6 +3795,9 @@ XXH_vmlal_high_u32(uint64x2_t acc, uint32x4_t lhs, uint32x4_t rhs)
3478
3795
  *
3479
3796
  * It also seems to fix some bad codegen on GCC, making it almost as fast as clang.
3480
3797
  *
3798
+ * When using WASM SIMD128, if this is 2 or 6, SIMDe will scalarize 2 of the lanes meaning
3799
+ * it effectively becomes worse 4.
3800
+ *
3481
3801
  * @see XXH3_accumulate_512_neon()
3482
3802
  */
3483
3803
  # ifndef XXH3_NEON_LANES
@@ -3623,7 +3943,6 @@ do { \
3623
3943
  } while (0)
3624
3944
  #endif /* XXH_VECTOR == XXH_SVE */
3625
3945
 
3626
-
3627
3946
  /* prefetch
3628
3947
  * can be disabled, by declaring XXH_NO_PREFETCH build macro */
3629
3948
  #if defined(XXH_NO_PREFETCH)
@@ -3668,6 +3987,8 @@ XXH_ALIGN(64) static const xxh_u8 XXH3_kSecret[XXH_SECRET_DEFAULT_SIZE] = {
3668
3987
  0x45, 0xcb, 0x3a, 0x8f, 0x95, 0x16, 0x04, 0x28, 0xaf, 0xd7, 0xfb, 0xca, 0xbb, 0x4b, 0x40, 0x7e,
3669
3988
  };
3670
3989
 
3990
+ static const xxh_u64 PRIME_MX1 = 0x165667919E3779F9ULL; /*!< 0b0001011001010110011001111001000110011110001101110111100111111001 */
3991
+ static const xxh_u64 PRIME_MX2 = 0x9FB21C651E98DF25ULL; /*!< 0b1001111110110010000111000110010100011110100110001101111100100101 */
3671
3992
 
3672
3993
  #ifdef XXH_OLD_NAMES
3673
3994
  # define kSecret XXH3_kSecret
@@ -3872,7 +4193,7 @@ XXH_FORCE_INLINE XXH_CONSTF xxh_u64 XXH_xorshift64(xxh_u64 v64, int shift)
3872
4193
  static XXH64_hash_t XXH3_avalanche(xxh_u64 h64)
3873
4194
  {
3874
4195
  h64 = XXH_xorshift64(h64, 37);
3875
- h64 *= 0x165667919E3779F9ULL;
4196
+ h64 *= PRIME_MX1;
3876
4197
  h64 = XXH_xorshift64(h64, 32);
3877
4198
  return h64;
3878
4199
  }
@@ -3886,9 +4207,9 @@ static XXH64_hash_t XXH3_rrmxmx(xxh_u64 h64, xxh_u64 len)
3886
4207
  {
3887
4208
  /* this mix is inspired by Pelle Evensen's rrmxmx */
3888
4209
  h64 ^= XXH_rotl64(h64, 49) ^ XXH_rotl64(h64, 24);
3889
- h64 *= 0x9FB21C651E98DF25ULL;
4210
+ h64 *= PRIME_MX2;
3890
4211
  h64 ^= (h64 >> 35) + len ;
3891
- h64 *= 0x9FB21C651E98DF25ULL;
4212
+ h64 *= PRIME_MX2;
3892
4213
  return XXH_xorshift64(h64, 28);
3893
4214
  }
3894
4215
 
@@ -4059,7 +4380,7 @@ XXH3_len_17to128_64b(const xxh_u8* XXH_RESTRICT input, size_t len,
4059
4380
  XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize;
4060
4381
  XXH_ASSERT(16 < len && len <= 128);
4061
4382
 
4062
- { xxh_u64 acc = len * XXH_PRIME64_1, acc_end;
4383
+ { xxh_u64 acc = len * XXH_PRIME64_1;
4063
4384
  #if XXH_SIZE_OPT >= 1
4064
4385
  /* Smaller and cleaner, but slightly slower. */
4065
4386
  unsigned int i = (unsigned int)(len - 1) / 32;
@@ -4067,25 +4388,23 @@ XXH3_len_17to128_64b(const xxh_u8* XXH_RESTRICT input, size_t len,
4067
4388
  acc += XXH3_mix16B(input+16 * i, secret+32*i, seed);
4068
4389
  acc += XXH3_mix16B(input+len-16*(i+1), secret+32*i+16, seed);
4069
4390
  } while (i-- != 0);
4070
- acc_end = 0;
4071
4391
  #else
4072
- acc += XXH3_mix16B(input+0, secret+0, seed);
4073
- acc_end = XXH3_mix16B(input+len-16, secret+16, seed);
4074
4392
  if (len > 32) {
4075
- acc += XXH3_mix16B(input+16, secret+32, seed);
4076
- acc_end += XXH3_mix16B(input+len-32, secret+48, seed);
4077
4393
  if (len > 64) {
4078
- acc += XXH3_mix16B(input+32, secret+64, seed);
4079
- acc_end += XXH3_mix16B(input+len-48, secret+80, seed);
4080
-
4081
4394
  if (len > 96) {
4082
4395
  acc += XXH3_mix16B(input+48, secret+96, seed);
4083
- acc_end += XXH3_mix16B(input+len-64, secret+112, seed);
4396
+ acc += XXH3_mix16B(input+len-64, secret+112, seed);
4084
4397
  }
4398
+ acc += XXH3_mix16B(input+32, secret+64, seed);
4399
+ acc += XXH3_mix16B(input+len-48, secret+80, seed);
4085
4400
  }
4401
+ acc += XXH3_mix16B(input+16, secret+32, seed);
4402
+ acc += XXH3_mix16B(input+len-32, secret+48, seed);
4086
4403
  }
4404
+ acc += XXH3_mix16B(input+0, secret+0, seed);
4405
+ acc += XXH3_mix16B(input+len-16, secret+16, seed);
4087
4406
  #endif
4088
- return XXH3_avalanche(acc + acc_end);
4407
+ return XXH3_avalanche(acc);
4089
4408
  }
4090
4409
  }
4091
4410
 
@@ -4576,7 +4895,7 @@ XXH3_scalarScrambleRound(void* XXH_RESTRICT acc,
4576
4895
 
4577
4896
  /*!
4578
4897
  * @internal
4579
- * @brief The bulk processing loop for NEON.
4898
+ * @brief The bulk processing loop for NEON and WASM SIMD128.
4580
4899
  *
4581
4900
  * The NEON code path is actually partially scalar when running on AArch64. This
4582
4901
  * is to optimize the pipelining and can have up to 15% speedup depending on the
@@ -4593,7 +4912,11 @@ XXH3_scalarScrambleRound(void* XXH_RESTRICT acc,
4593
4912
  * Since, as stated, the most optimal amount of lanes for Cortexes is 6,
4594
4913
  * there needs to be *three* versions of the accumulate operation used
4595
4914
  * for the remaining 2 lanes.
4915
+ *
4916
+ * WASM's SIMD128 uses SIMDe's arm_neon.h polyfill because the intrinsics overlap
4917
+ * nearly perfectly.
4596
4918
  */
4919
+
4597
4920
  XXH_FORCE_INLINE void
4598
4921
  XXH3_accumulate_512_neon( void* XXH_RESTRICT acc,
4599
4922
  const void* XXH_RESTRICT input,
@@ -4604,10 +4927,30 @@ XXH3_accumulate_512_neon( void* XXH_RESTRICT acc,
4604
4927
  { /* GCC for darwin arm64 does not like aliasing here */
4605
4928
  xxh_aliasing_uint64x2_t* const xacc = (xxh_aliasing_uint64x2_t*) acc;
4606
4929
  /* We don't use a uint32x4_t pointer because it causes bus errors on ARMv7. */
4607
- uint8_t const* const xinput = (const uint8_t *) input;
4608
- uint8_t const* const xsecret = (const uint8_t *) secret;
4930
+ uint8_t const* xinput = (const uint8_t *) input;
4931
+ uint8_t const* xsecret = (const uint8_t *) secret;
4609
4932
 
4610
4933
  size_t i;
4934
+ #ifdef __wasm_simd128__
4935
+ /*
4936
+ * On WASM SIMD128, Clang emits direct address loads when XXH3_kSecret
4937
+ * is constant propagated, which results in it converting it to this
4938
+ * inside the loop:
4939
+ *
4940
+ * a = v128.load(XXH3_kSecret + 0 + $secret_offset, offset = 0)
4941
+ * b = v128.load(XXH3_kSecret + 16 + $secret_offset, offset = 0)
4942
+ * ...
4943
+ *
4944
+ * This requires a full 32-bit address immediate (and therefore a 6 byte
4945
+ * instruction) as well as an add for each offset.
4946
+ *
4947
+ * Putting an asm guard prevents it from folding (at the cost of losing
4948
+ * the alignment hint), and uses the free offset in `v128.load` instead
4949
+ * of adding secret_offset each time which overall reduces code size by
4950
+ * about a kilobyte and improves performance.
4951
+ */
4952
+ XXH_COMPILER_GUARD(xsecret);
4953
+ #endif
4611
4954
  /* Scalar lanes use the normal scalarRound routine */
4612
4955
  for (i = XXH3_NEON_LANES; i < XXH_ACC_NB; i++) {
4613
4956
  XXH3_scalarRound(acc, input, secret, i);
@@ -4634,9 +4977,9 @@ XXH3_accumulate_512_neon( void* XXH_RESTRICT acc,
4634
4977
  * get one vector with the low 32 bits of each lane, and one vector
4635
4978
  * with the high 32 bits of each lane.
4636
4979
  *
4637
- * This compiles to two instructions on AArch64 and has a paired vector
4638
- * result, which is an artifact from ARMv7a's version which modified both
4639
- * vectors in place.
4980
+ * The intrinsic returns a double vector because the original ARMv7-a
4981
+ * instruction modified both arguments in place. AArch64 and SIMD128 emit
4982
+ * two instructions from this intrinsic.
4640
4983
  *
4641
4984
  * [ dk11L | dk11H | dk12L | dk12H ] -> [ dk11L | dk12L | dk21L | dk22L ]
4642
4985
  * [ dk21L | dk21H | dk22L | dk22H ] -> [ dk11H | dk12H | dk21H | dk22H ]
@@ -4652,7 +4995,7 @@ XXH3_accumulate_512_neon( void* XXH_RESTRICT acc,
4652
4995
  /*
4653
4996
  * Then, we can split the vectors horizontally and multiply which, as for most
4654
4997
  * widening intrinsics, have a variant that works on both high half vectors
4655
- * for free on AArch64.
4998
+ * for free on AArch64. A similar instruction is available on SIMD128.
4656
4999
  *
4657
5000
  * sum = data_swap + (u64x2) data_key_lo * (u64x2) data_key_hi
4658
5001
  */
@@ -4670,8 +5013,8 @@ XXH3_accumulate_512_neon( void* XXH_RESTRICT acc,
4670
5013
  * for reasons likely related to umlal being limited to certain NEON
4671
5014
  * pipelines, this is worse. A compiler guard fixes this.
4672
5015
  */
4673
- XXH_COMPILER_GUARD_W(sum_1);
4674
- XXH_COMPILER_GUARD_W(sum_2);
5016
+ XXH_COMPILER_GUARD_CLANG_NEON(sum_1);
5017
+ XXH_COMPILER_GUARD_CLANG_NEON(sum_2);
4675
5018
  /* xacc[i] = acc_vec + sum; */
4676
5019
  xacc[i] = vaddq_u64(xacc[i], sum_1);
4677
5020
  xacc[i+1] = vaddq_u64(xacc[i+1], sum_2);
@@ -4694,7 +5037,7 @@ XXH3_accumulate_512_neon( void* XXH_RESTRICT acc,
4694
5037
  /* sum = data_swap + (u64x2) data_key_lo * (u64x2) data_key_hi; */
4695
5038
  uint64x2_t sum = vmlal_u32(data_swap, data_key_lo, data_key_hi);
4696
5039
  /* Same Clang workaround as before */
4697
- XXH_COMPILER_GUARD_W(sum);
5040
+ XXH_COMPILER_GUARD_CLANG_NEON(sum);
4698
5041
  /* xacc[i] = acc_vec + sum; */
4699
5042
  xacc[i] = vaddq_u64 (xacc[i], sum);
4700
5043
  }
@@ -4709,9 +5052,16 @@ XXH3_scrambleAcc_neon(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret)
4709
5052
 
4710
5053
  { xxh_aliasing_uint64x2_t* xacc = (xxh_aliasing_uint64x2_t*) acc;
4711
5054
  uint8_t const* xsecret = (uint8_t const*) secret;
4712
- uint32x2_t prime = vdup_n_u32 (XXH_PRIME32_1);
4713
5055
 
4714
5056
  size_t i;
5057
+ /* WASM uses operator overloads and doesn't need these. */
5058
+ #ifndef __wasm_simd128__
5059
+ /* { prime32_1, prime32_1 } */
5060
+ uint32x2_t const kPrimeLo = vdup_n_u32(XXH_PRIME32_1);
5061
+ /* { 0, prime32_1, 0, prime32_1 } */
5062
+ uint32x4_t const kPrimeHi = vreinterpretq_u32_u64(vdupq_n_u64((xxh_u64)XXH_PRIME32_1 << 32));
5063
+ #endif
5064
+
4715
5065
  /* AArch64 uses both scalar and neon at the same time */
4716
5066
  for (i = XXH3_NEON_LANES; i < XXH_ACC_NB; i++) {
4717
5067
  XXH3_scalarScrambleRound(acc, secret, i);
@@ -4725,33 +5075,28 @@ XXH3_scrambleAcc_neon(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret)
4725
5075
  /* xacc[i] ^= xsecret[i]; */
4726
5076
  uint64x2_t key_vec = XXH_vld1q_u64(xsecret + (i * 16));
4727
5077
  uint64x2_t data_key = veorq_u64(data_vec, key_vec);
4728
-
4729
5078
  /* xacc[i] *= XXH_PRIME32_1 */
4730
- uint32x2_t data_key_lo = vmovn_u64(data_key);
4731
- uint32x2_t data_key_hi = vshrn_n_u64(data_key, 32);
5079
+ #ifdef __wasm_simd128__
5080
+ /* SIMD128 has multiply by u64x2, use it instead of expanding and scalarizing */
5081
+ xacc[i] = data_key * XXH_PRIME32_1;
5082
+ #else
4732
5083
  /*
4733
- * prod_hi = (data_key >> 32) * XXH_PRIME32_1;
5084
+ * Expanded version with portable NEON intrinsics
4734
5085
  *
4735
- * Avoid vmul_u32 + vshll_n_u32 since Clang 6 and 7 will
4736
- * incorrectly "optimize" this:
4737
- * tmp = vmul_u32(vmovn_u64(a), vmovn_u64(b));
4738
- * shifted = vshll_n_u32(tmp, 32);
4739
- * to this:
4740
- * tmp = "vmulq_u64"(a, b); // no such thing!
4741
- * shifted = vshlq_n_u64(tmp, 32);
5086
+ * lo(x) * lo(y) + (hi(x) * lo(y) << 32)
4742
5087
  *
4743
- * However, unlike SSE, Clang lacks a 64-bit multiply routine
4744
- * for NEON, and it scalarizes two 64-bit multiplies instead.
5088
+ * prod_hi = hi(data_key) * lo(prime) << 32
4745
5089
  *
4746
- * vmull_u32 has the same timing as vmul_u32, and it avoids
4747
- * this bug completely.
4748
- * See https://bugs.llvm.org/show_bug.cgi?id=39967
5090
+ * Since we only need 32 bits of this multiply a trick can be used, reinterpreting the vector
5091
+ * as a uint32x4_t and multiplying by { 0, prime, 0, prime } to cancel out the unwanted bits
5092
+ * and avoid the shift.
4749
5093
  */
4750
- uint64x2_t prod_hi = vmull_u32 (data_key_hi, prime);
4751
- /* xacc[i] = prod_hi << 32; */
4752
- prod_hi = vshlq_n_u64(prod_hi, 32);
4753
- /* xacc[i] += (prod_hi & 0xFFFFFFFF) * XXH_PRIME32_1; */
4754
- xacc[i] = vmlal_u32(prod_hi, data_key_lo, prime);
5094
+ uint32x4_t prod_hi = vmulq_u32 (vreinterpretq_u32_u64(data_key), kPrimeHi);
5095
+ /* Extract low bits for vmlal_u32 */
5096
+ uint32x2_t data_key_lo = vmovn_u64(data_key);
5097
+ /* xacc[i] = prod_hi + lo(data_key) * XXH_PRIME32_1; */
5098
+ xacc[i] = vmlal_u32(vreinterpretq_u64_u32(prod_hi), data_key_lo, kPrimeLo);
5099
+ #endif
4755
5100
  }
4756
5101
  }
4757
5102
  }
@@ -5467,6 +5812,12 @@ static void XXH_alignedFree(void* p)
5467
5812
  }
5468
5813
  }
5469
5814
  /*! @ingroup XXH3_family */
5815
+ /*!
5816
+ * @brief Allocate an @ref XXH3_state_t.
5817
+ *
5818
+ * Must be freed with XXH3_freeState().
5819
+ * @return An allocated XXH3_state_t on success, `NULL` on failure.
5820
+ */
5470
5821
  XXH_PUBLIC_API XXH3_state_t* XXH3_createState(void)
5471
5822
  {
5472
5823
  XXH3_state_t* const state = (XXH3_state_t*)XXH_alignedMalloc(sizeof(XXH3_state_t), 64);
@@ -5476,6 +5827,13 @@ XXH_PUBLIC_API XXH3_state_t* XXH3_createState(void)
5476
5827
  }
5477
5828
 
5478
5829
  /*! @ingroup XXH3_family */
5830
+ /*!
5831
+ * @brief Frees an @ref XXH3_state_t.
5832
+ *
5833
+ * Must be allocated with XXH3_createState().
5834
+ * @param statePtr A pointer to an @ref XXH3_state_t allocated with @ref XXH3_createState().
5835
+ * @return XXH_OK.
5836
+ */
5479
5837
  XXH_PUBLIC_API XXH_errorcode XXH3_freeState(XXH3_state_t* statePtr)
5480
5838
  {
5481
5839
  XXH_alignedFree(statePtr);
@@ -5832,7 +6190,7 @@ XXH3_len_4to8_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_
5832
6190
  m128.low64 ^= (m128.high64 >> 3);
5833
6191
 
5834
6192
  m128.low64 = XXH_xorshift64(m128.low64, 35);
5835
- m128.low64 *= 0x9FB21C651E98DF25ULL;
6193
+ m128.low64 *= PRIME_MX2;
5836
6194
  m128.low64 = XXH_xorshift64(m128.low64, 28);
5837
6195
  m128.high64 = XXH3_avalanche(m128.high64);
5838
6196
  return m128;
@@ -2,6 +2,6 @@ require 'digest'
2
2
 
3
3
  module Digest
4
4
  class XXHash < Digest::Class
5
- VERSION = "0.2.6"
5
+ VERSION = "0.2.8"
6
6
  end
7
7
  end
@@ -61,12 +61,12 @@ end
61
61
  end
62
62
 
63
63
  if bit_size == 32
64
- ["00000000"].concat(_32bit_seeds_cycles.next).each do |seed|
64
+ ["00000000", "ffffffff"].concat(_32bit_seeds_cycles.next).each do |seed|
65
65
  sum = XXhash.xxh32(msg, seed.to_i(16))
66
66
  puts "#{bit_size}|#{msg_method}|#{msg_length}|seed|#{seed}|#{"%08x" % sum}"
67
67
  end
68
68
  else
69
- ["0000000000000000"].concat(_64bit_seeds).each do |seed|
69
+ ["0000000000000000", "ffffffffffffffff"].concat(_64bit_seeds).each do |seed|
70
70
  sum = XXhash.xxh64(msg, seed.to_i(16))
71
71
  puts "#{bit_size}|#{msg_method}|#{msg_length}|seed|#{seed}|#{"%016x" % sum}"
72
72
  end
@@ -65,19 +65,19 @@ end.flatten(1).each do |algo, msg_method, msg_length|
65
65
 
66
66
  case algo
67
67
  when '32'
68
- ["00000000"].concat(_32bit_seeds_cycles.next).each do |seed|
68
+ ["00000000", "ffffffff"].concat(_32bit_seeds_cycles.next).each do |seed|
69
69
  produce_vectors(algo, 0, :seed, seed, msg, msg_method)
70
70
  end
71
71
  when '64'
72
- ["0000000000000000"].concat(_64bit_seeds).each do |seed|
72
+ ["0000000000000000", "ffffffffffffffff"].concat(_64bit_seeds).each do |seed|
73
73
  produce_vectors(algo, 1, :seed, seed, msg, msg_method)
74
74
  end
75
75
  when 'xxh3-64'
76
- ["0000000000000000"].concat(_64bit_seeds).each do |seed|
76
+ ["0000000000000000", "ffffffffffffffff"].concat(_64bit_seeds).each do |seed|
77
77
  produce_vectors(algo, 3, :seed, seed, msg, msg_method)
78
78
  end
79
79
  when 'xxh3-128'
80
- ["0000000000000000"].concat(_64bit_seeds).each do |seed|
80
+ ["0000000000000000", "ffffffffffffffff"].concat(_64bit_seeds).each do |seed|
81
81
  produce_vectors(algo, 2, :seed, seed, msg, msg_method)
82
82
  end
83
83
  end
data/test/test.rb CHANGED
@@ -85,15 +85,21 @@ CSV.foreach(File.join(TEST_DIR, 'test.vectors'), col_sep: '|').with_index(1) do
85
85
  when 'seed'
86
86
  describe klass do
87
87
  describe "using #{msg_method}(#{msg_length}) as message generator, and #{seed_or_secret} as seed" do
88
- it "should produce #{sum}" do
88
+ it "should produce #{sum}" do
89
89
  _(klass.hexdigest(msg, seed_or_secret)).must_equal sum
90
90
  end
91
+ it "should produce #{sum} using reset-first strategy" do
92
+ _(klass.new.reset(seed_or_secret).update(msg).hexdigest).must_equal sum
93
+ end
94
+ it "should produce #{sum} using reset-first strategy with an external hex-to-int converter" do
95
+ _(klass.new.reset(seed_or_secret.to_i(16)).update(msg).hexdigest).must_equal sum
96
+ end
91
97
  end
92
98
  end
93
99
  when 'secret'
94
100
  describe klass do
95
101
  describe "using #{msg_method}(#{msg_length}) as message generator, and #{seed_or_secret} as secret" do
96
- it "should produce #{sum}" do
102
+ it "should produce #{sum}" do
97
103
  secret_str = [seed_or_secret].pack('H*')
98
104
  _(klass.new.reset_with_secret(secret_str).update(msg).hexdigest).must_equal sum
99
105
  end
data/test/test.vectors CHANGED
@@ -1,4 +1,5 @@
1
1
  32|null|0|seed|00000000|02cc5d05
2
+ 32|null|0|seed|ffffffff|9061da9d
2
3
  32|null|0|seed|637c777b|5a96008b
3
4
  32|null|0|seed|f26b6fc5|bb5db574
4
5
  32|null|0|seed|3001672b|82603888
@@ -32,6 +33,7 @@
32
33
  32|null|0|seed|bcb6da21|aadfec4b
33
34
  32|null|0|seed|10fff3d2|b955cc5b
34
35
  32|0x00_to_0xff|1|seed|00000000|cf65b03e
36
+ 32|0x00_to_0xff|1|seed|ffffffff|36705d21
35
37
  32|0x00_to_0xff|1|seed|cd0c13ec|473c769a
36
38
  32|0x00_to_0xff|1|seed|5f974417|048fbdba
37
39
  32|0x00_to_0xff|1|seed|c4a77e3d|37b734eb
@@ -65,6 +67,7 @@
65
67
  32|0x00_to_0xff|1|seed|41992d0f|e6c03239
66
68
  32|0x00_to_0xff|1|seed|b054bb16|4e989ac4
67
69
  32|0x00_to_0xff|17|seed|00000000|7c77adc2
70
+ 32|0x00_to_0xff|17|seed|ffffffff|e6cb4d35
68
71
  32|0x00_to_0xff|17|seed|637c777b|2b8057a4
69
72
  32|0x00_to_0xff|17|seed|f26b6fc5|a7c19204
70
73
  32|0x00_to_0xff|17|seed|3001672b|f4ac30fc
@@ -98,6 +101,7 @@
98
101
  32|0x00_to_0xff|17|seed|bcb6da21|17347200
99
102
  32|0x00_to_0xff|17|seed|10fff3d2|b0489881
100
103
  32|0x00_to_0xff|289|seed|00000000|3a92aa17
104
+ 32|0x00_to_0xff|289|seed|ffffffff|177d6436
101
105
  32|0x00_to_0xff|289|seed|cd0c13ec|0f1014b4
102
106
  32|0x00_to_0xff|289|seed|5f974417|c7b0e593
103
107
  32|0x00_to_0xff|289|seed|c4a77e3d|2d9e661b
@@ -131,6 +135,7 @@
131
135
  32|0x00_to_0xff|289|seed|41992d0f|ec6ad984
132
136
  32|0x00_to_0xff|289|seed|b054bb16|026fe6af
133
137
  32|0x00_to_0xff|4913|seed|00000000|21f3597d
138
+ 32|0x00_to_0xff|4913|seed|ffffffff|0999ec33
134
139
  32|0x00_to_0xff|4913|seed|637c777b|f8c710f7
135
140
  32|0x00_to_0xff|4913|seed|f26b6fc5|1e398031
136
141
  32|0x00_to_0xff|4913|seed|3001672b|e89652fb
@@ -164,6 +169,7 @@
164
169
  32|0x00_to_0xff|4913|seed|bcb6da21|b3258fa8
165
170
  32|0x00_to_0xff|4913|seed|10fff3d2|c88665e7
166
171
  32|0x00_to_0xff|83521|seed|00000000|1980b84a
172
+ 32|0x00_to_0xff|83521|seed|ffffffff|71eba16c
167
173
  32|0x00_to_0xff|83521|seed|cd0c13ec|c44fb92e
168
174
  32|0x00_to_0xff|83521|seed|5f974417|aa3ecce2
169
175
  32|0x00_to_0xff|83521|seed|c4a77e3d|4fe3a42a
@@ -197,6 +203,7 @@
197
203
  32|0x00_to_0xff|83521|seed|41992d0f|5105d36e
198
204
  32|0x00_to_0xff|83521|seed|b054bb16|c309b0da
199
205
  32|0x00_to_0xff|1419857|seed|00000000|acc0ab63
206
+ 32|0x00_to_0xff|1419857|seed|ffffffff|317c2a06
200
207
  32|0x00_to_0xff|1419857|seed|637c777b|8554af99
201
208
  32|0x00_to_0xff|1419857|seed|f26b6fc5|92c7210a
202
209
  32|0x00_to_0xff|1419857|seed|3001672b|c07d3b57
@@ -230,6 +237,7 @@
230
237
  32|0x00_to_0xff|1419857|seed|bcb6da21|c2c85e16
231
238
  32|0x00_to_0xff|1419857|seed|10fff3d2|39b48d85
232
239
  64|null|0|seed|0000000000000000|ef46db3751d8e999
240
+ 64|null|0|seed|ffffffffffffffff|298f4c84b24f5380
233
241
  64|null|0|seed|637c777bf26b6fc5|0dd21c8fc60666b0
234
242
  64|null|0|seed|3001672bfed7ab76|0dbcc89d7c534ce1
235
243
  64|null|0|seed|ca82c97dfa5947f0|465bc35b109f025c
@@ -263,6 +271,7 @@
263
271
  64|null|0|seed|8ca1890dbfe64268|9d73f5963bfff2f1
264
272
  64|null|0|seed|41992d0fb054bb16|e18c27ac6f9faf31
265
273
  64|0x00_to_0xff|1|seed|0000000000000000|e934a84adb052768
274
+ 64|0x00_to_0xff|1|seed|ffffffffffffffff|8ba3328805e37c90
266
275
  64|0x00_to_0xff|1|seed|637c777bf26b6fc5|35e5227462680092
267
276
  64|0x00_to_0xff|1|seed|3001672bfed7ab76|4ccc00f2b25ec08c
268
277
  64|0x00_to_0xff|1|seed|ca82c97dfa5947f0|c30babbac78fa660
@@ -296,6 +305,7 @@
296
305
  64|0x00_to_0xff|1|seed|8ca1890dbfe64268|cdaff4970a9af9bc
297
306
  64|0x00_to_0xff|1|seed|41992d0fb054bb16|9dc3caf4a9a348a8
298
307
  64|0x00_to_0xff|17|seed|0000000000000000|5603e60c527599b6
308
+ 64|0x00_to_0xff|17|seed|ffffffffffffffff|7a88f65a252d7f1f
299
309
  64|0x00_to_0xff|17|seed|637c777bf26b6fc5|247079864f5387c3
300
310
  64|0x00_to_0xff|17|seed|3001672bfed7ab76|739d5190b9a7427b
301
311
  64|0x00_to_0xff|17|seed|ca82c97dfa5947f0|5990a8dcd5d2e8f8
@@ -329,6 +339,7 @@
329
339
  64|0x00_to_0xff|17|seed|8ca1890dbfe64268|1a05696c1b9fa480
330
340
  64|0x00_to_0xff|17|seed|41992d0fb054bb16|57ce87cdf27747bb
331
341
  64|0x00_to_0xff|289|seed|0000000000000000|7071ff1165cf8f54
342
+ 64|0x00_to_0xff|289|seed|ffffffffffffffff|e4cbaec2cebc25f8
332
343
  64|0x00_to_0xff|289|seed|637c777bf26b6fc5|b0848fb5c600966e
333
344
  64|0x00_to_0xff|289|seed|3001672bfed7ab76|9e51ad1b4971641c
334
345
  64|0x00_to_0xff|289|seed|ca82c97dfa5947f0|1c516da2b2d9bf67
@@ -362,6 +373,7 @@
362
373
  64|0x00_to_0xff|289|seed|8ca1890dbfe64268|b0a68d3b0898bece
363
374
  64|0x00_to_0xff|289|seed|41992d0fb054bb16|c323bb80fa9b8f5e
364
375
  64|0x00_to_0xff|4913|seed|0000000000000000|810afdebd1aedb92
376
+ 64|0x00_to_0xff|4913|seed|ffffffffffffffff|680180508666aceb
365
377
  64|0x00_to_0xff|4913|seed|637c777bf26b6fc5|a12fe480cb724a04
366
378
  64|0x00_to_0xff|4913|seed|3001672bfed7ab76|1add823f2db0a160
367
379
  64|0x00_to_0xff|4913|seed|ca82c97dfa5947f0|84e6bb2f2d53724e
@@ -395,6 +407,7 @@
395
407
  64|0x00_to_0xff|4913|seed|8ca1890dbfe64268|2ef5204b6eb2ce3b
396
408
  64|0x00_to_0xff|4913|seed|41992d0fb054bb16|ad57ed2703c18390
397
409
  64|0x00_to_0xff|83521|seed|0000000000000000|accb5a7df8ba2382
410
+ 64|0x00_to_0xff|83521|seed|ffffffffffffffff|e8ae3fe8a6359248
398
411
  64|0x00_to_0xff|83521|seed|637c777bf26b6fc5|dba99ad0e0512c9d
399
412
  64|0x00_to_0xff|83521|seed|3001672bfed7ab76|6f312d43018ededa
400
413
  64|0x00_to_0xff|83521|seed|ca82c97dfa5947f0|04c09a95475de179
@@ -428,6 +441,7 @@
428
441
  64|0x00_to_0xff|83521|seed|8ca1890dbfe64268|df517ed6f189e38b
429
442
  64|0x00_to_0xff|83521|seed|41992d0fb054bb16|22246fa2a58dc1b6
430
443
  64|0x00_to_0xff|1419857|seed|0000000000000000|38d35bb42f9df69e
444
+ 64|0x00_to_0xff|1419857|seed|ffffffffffffffff|f9e87bf8b5977958
431
445
  64|0x00_to_0xff|1419857|seed|637c777bf26b6fc5|e22909f3b8637bd7
432
446
  64|0x00_to_0xff|1419857|seed|3001672bfed7ab76|47d4c38a3e78c379
433
447
  64|0x00_to_0xff|1419857|seed|ca82c97dfa5947f0|ca55c254db500d6b
@@ -461,6 +475,7 @@
461
475
  64|0x00_to_0xff|1419857|seed|8ca1890dbfe64268|4d952123daf3237d
462
476
  64|0x00_to_0xff|1419857|seed|41992d0fb054bb16|75a76b45e544d4f6
463
477
  xxh3-64|null|0|seed|0000000000000000|2d06800538d394c2
478
+ xxh3-64|null|0|seed|ffffffffffffffff|4c093276ae47a555
464
479
  xxh3-64|null|0|seed|637c777bf26b6fc5|2c4f9046176136d1
465
480
  xxh3-64|null|0|seed|3001672bfed7ab76|c7676a6960011366
466
481
  xxh3-64|null|0|seed|ca82c97dfa5947f0|5735253b7191c043
@@ -494,6 +509,7 @@ xxh3-64|null|0|seed|9b1e87e9ce5528df|90badd047a8e51b7
494
509
  xxh3-64|null|0|seed|8ca1890dbfe64268|21c4c14d55aa30ce
495
510
  xxh3-64|null|0|seed|41992d0fb054bb16|b92249133f11f62b
496
511
  xxh3-64|0x00_to_0xff|1|seed|0000000000000000|c44bdff4074eecdb
512
+ xxh3-64|0x00_to_0xff|1|seed|ffffffffffffffff|77b2df5ff42aab88
497
513
  xxh3-64|0x00_to_0xff|1|seed|637c777bf26b6fc5|06364bdeddd65cea
498
514
  xxh3-64|0x00_to_0xff|1|seed|3001672bfed7ab76|c19fb6b90743cf74
499
515
  xxh3-64|0x00_to_0xff|1|seed|ca82c97dfa5947f0|42bae153d87bdd2d
@@ -527,6 +543,7 @@ xxh3-64|0x00_to_0xff|1|seed|9b1e87e9ce5528df|995de8342e20c171
527
543
  xxh3-64|0x00_to_0xff|1|seed|8ca1890dbfe64268|f1a0287143f38809
528
544
  xxh3-64|0x00_to_0xff|1|seed|41992d0fb054bb16|d6c5011efd908a2f
529
545
  xxh3-64|0x00_to_0xff|17|seed|0000000000000000|9ef341a99de37328
546
+ xxh3-64|0x00_to_0xff|17|seed|ffffffffffffffff|3b81616daebc9078
530
547
  xxh3-64|0x00_to_0xff|17|seed|637c777bf26b6fc5|63262024085a6db8
531
548
  xxh3-64|0x00_to_0xff|17|seed|3001672bfed7ab76|fca69fdf15963440
532
549
  xxh3-64|0x00_to_0xff|17|seed|ca82c97dfa5947f0|168ceccaefee6409
@@ -560,6 +577,7 @@ xxh3-64|0x00_to_0xff|17|seed|9b1e87e9ce5528df|11e75fd353c8fc16
560
577
  xxh3-64|0x00_to_0xff|17|seed|8ca1890dbfe64268|9c9c8abf35a1a637
561
578
  xxh3-64|0x00_to_0xff|17|seed|41992d0fb054bb16|ebb4047b4538c506
562
579
  xxh3-64|0x00_to_0xff|289|seed|0000000000000000|7ce229b939ee8aa5
580
+ xxh3-64|0x00_to_0xff|289|seed|ffffffffffffffff|04f35fc4a26cee50
563
581
  xxh3-64|0x00_to_0xff|289|seed|637c777bf26b6fc5|d068e75bf96e676e
564
582
  xxh3-64|0x00_to_0xff|289|seed|3001672bfed7ab76|72ac7e4f6927f9c5
565
583
  xxh3-64|0x00_to_0xff|289|seed|ca82c97dfa5947f0|47e3b35896df3599
@@ -593,6 +611,7 @@ xxh3-64|0x00_to_0xff|289|seed|9b1e87e9ce5528df|00e722b9170c33e9
593
611
  xxh3-64|0x00_to_0xff|289|seed|8ca1890dbfe64268|06409988a2ee6a93
594
612
  xxh3-64|0x00_to_0xff|289|seed|41992d0fb054bb16|e7d1da11d4debcde
595
613
  xxh3-64|0x00_to_0xff|4913|seed|0000000000000000|1e8c5e95a0050ca2
614
+ xxh3-64|0x00_to_0xff|4913|seed|ffffffffffffffff|5791974bb056cb6c
596
615
  xxh3-64|0x00_to_0xff|4913|seed|637c777bf26b6fc5|dd463537aa71c50d
597
616
  xxh3-64|0x00_to_0xff|4913|seed|3001672bfed7ab76|3d05e95b882e80b8
598
617
  xxh3-64|0x00_to_0xff|4913|seed|ca82c97dfa5947f0|d22b8f9a1da2a253
@@ -626,6 +645,7 @@ xxh3-64|0x00_to_0xff|4913|seed|9b1e87e9ce5528df|96e6e9c62223d758
626
645
  xxh3-64|0x00_to_0xff|4913|seed|8ca1890dbfe64268|842853d50e2d42f8
627
646
  xxh3-64|0x00_to_0xff|4913|seed|41992d0fb054bb16|3478ed950eea71a2
628
647
  xxh3-64|0x00_to_0xff|83521|seed|0000000000000000|b0281ef3f89126cc
648
+ xxh3-64|0x00_to_0xff|83521|seed|ffffffffffffffff|16f889f26216ec87
629
649
  xxh3-64|0x00_to_0xff|83521|seed|637c777bf26b6fc5|1d20bfdeee418090
630
650
  xxh3-64|0x00_to_0xff|83521|seed|3001672bfed7ab76|c45a140b80416735
631
651
  xxh3-64|0x00_to_0xff|83521|seed|ca82c97dfa5947f0|6aa5924f9aa66211
@@ -659,6 +679,7 @@ xxh3-64|0x00_to_0xff|83521|seed|9b1e87e9ce5528df|d82602ed2359a8d0
659
679
  xxh3-64|0x00_to_0xff|83521|seed|8ca1890dbfe64268|7c13267f59f6fc64
660
680
  xxh3-64|0x00_to_0xff|83521|seed|41992d0fb054bb16|19434a5aabe574a3
661
681
  xxh3-64|0x00_to_0xff|1419857|seed|0000000000000000|ca08ebf4a4461aff
682
+ xxh3-64|0x00_to_0xff|1419857|seed|ffffffffffffffff|1fceafa7d65bc018
662
683
  xxh3-64|0x00_to_0xff|1419857|seed|637c777bf26b6fc5|746df9df0e51bf12
663
684
  xxh3-64|0x00_to_0xff|1419857|seed|3001672bfed7ab76|e1df015be53e2881
664
685
  xxh3-64|0x00_to_0xff|1419857|seed|ca82c97dfa5947f0|ab406958f59d2c1b
@@ -692,6 +713,7 @@ xxh3-64|0x00_to_0xff|1419857|seed|9b1e87e9ce5528df|8111722674c3f69f
692
713
  xxh3-64|0x00_to_0xff|1419857|seed|8ca1890dbfe64268|5ca80e7c4eedea84
693
714
  xxh3-64|0x00_to_0xff|1419857|seed|41992d0fb054bb16|a2b618451077a883
694
715
  xxh3-128|null|0|seed|0000000000000000|99aa06d3014798d86001c324468d497f
716
+ xxh3-128|null|0|seed|ffffffffffffffff|5334ec22748b5fcd2d10110a247d19dd
695
717
  xxh3-128|null|0|seed|637c777bf26b6fc5|1d13eedd842a2f89cfb19628b2fcb893
696
718
  xxh3-128|null|0|seed|3001672bfed7ab76|0d96c569b744e5358c11703ac0f5aac6
697
719
  xxh3-128|null|0|seed|ca82c97dfa5947f0|6efcfbc0300dd2a1971ca9a7bddc0ba4
@@ -725,6 +747,7 @@ xxh3-128|null|0|seed|9b1e87e9ce5528df|8328e47e5197b8121354327b8c48d109
725
747
  xxh3-128|null|0|seed|8ca1890dbfe64268|6f2c2ed3e67d181d72b4c3f1b57ea275
726
748
  xxh3-128|null|0|seed|41992d0fb054bb16|b3905512d0b881f48aae5a21ee9a11c3
727
749
  xxh3-128|0x00_to_0xff|1|seed|0000000000000000|a6cd5e9392000f6ac44bdff4074eecdb
750
+ xxh3-128|0x00_to_0xff|1|seed|ffffffffffffffff|4084b473dcc29b5977b2df5ff42aab88
728
751
  xxh3-128|0x00_to_0xff|1|seed|637c777bf26b6fc5|56baaa3aaaddd71f06364bdeddd65cea
729
752
  xxh3-128|0x00_to_0xff|1|seed|3001672bfed7ab76|b94f8fbbedcd3e44c19fb6b90743cf74
730
753
  xxh3-128|0x00_to_0xff|1|seed|ca82c97dfa5947f0|268bbf99d48e115342bae153d87bdd2d
@@ -758,6 +781,7 @@ xxh3-128|0x00_to_0xff|1|seed|9b1e87e9ce5528df|2f0b417c822e049e995de8342e20c171
758
781
  xxh3-128|0x00_to_0xff|1|seed|8ca1890dbfe64268|a8b23e7e3773457ff1a0287143f38809
759
782
  xxh3-128|0x00_to_0xff|1|seed|41992d0fb054bb16|1b94757afc6eb0e5d6c5011efd908a2f
760
783
  xxh3-128|0x00_to_0xff|17|seed|0000000000000000|685bc458b37d057fc06e233df7729217
784
+ xxh3-128|0x00_to_0xff|17|seed|ffffffffffffffff|17c7b437f6a79da6193a927b32cfc801
761
785
  xxh3-128|0x00_to_0xff|17|seed|637c777bf26b6fc5|d8393deb230f225c5f3c8fa757b43062
762
786
  xxh3-128|0x00_to_0xff|17|seed|3001672bfed7ab76|07dc3fea48e0461e85e4c485db2c194c
763
787
  xxh3-128|0x00_to_0xff|17|seed|ca82c97dfa5947f0|645b6eaf2035e5cd706a264848272abc
@@ -791,6 +815,7 @@ xxh3-128|0x00_to_0xff|17|seed|9b1e87e9ce5528df|30bcb8b7f1b6a70c04b67637fe10153c
791
815
  xxh3-128|0x00_to_0xff|17|seed|8ca1890dbfe64268|5486861c72114c10f9ba56ef2b9f366e
792
816
  xxh3-128|0x00_to_0xff|17|seed|41992d0fb054bb16|63b1fe7975d16bdd6b4f583ea797d231
793
817
  xxh3-128|0x00_to_0xff|289|seed|0000000000000000|c3b827968425505f7ce229b939ee8aa5
818
+ xxh3-128|0x00_to_0xff|289|seed|ffffffffffffffff|ba45f8814e1762ed04f35fc4a26cee50
794
819
  xxh3-128|0x00_to_0xff|289|seed|637c777bf26b6fc5|a08c67d97cb3d311d068e75bf96e676e
795
820
  xxh3-128|0x00_to_0xff|289|seed|3001672bfed7ab76|4ec600e486e8dd8f72ac7e4f6927f9c5
796
821
  xxh3-128|0x00_to_0xff|289|seed|ca82c97dfa5947f0|e0c494ebb6452e9c47e3b35896df3599
@@ -824,6 +849,7 @@ xxh3-128|0x00_to_0xff|289|seed|9b1e87e9ce5528df|765ec7f0305c532500e722b9170c33e9
824
849
  xxh3-128|0x00_to_0xff|289|seed|8ca1890dbfe64268|d49811a76d8fa4ed06409988a2ee6a93
825
850
  xxh3-128|0x00_to_0xff|289|seed|41992d0fb054bb16|4589f0279c39b399e7d1da11d4debcde
826
851
  xxh3-128|0x00_to_0xff|4913|seed|0000000000000000|ea86f57d10a231bb1e8c5e95a0050ca2
852
+ xxh3-128|0x00_to_0xff|4913|seed|ffffffffffffffff|82aad45a56c3e3a75791974bb056cb6c
827
853
  xxh3-128|0x00_to_0xff|4913|seed|637c777bf26b6fc5|b6e5c25611d3ab59dd463537aa71c50d
828
854
  xxh3-128|0x00_to_0xff|4913|seed|3001672bfed7ab76|8935a13e1f87724b3d05e95b882e80b8
829
855
  xxh3-128|0x00_to_0xff|4913|seed|ca82c97dfa5947f0|45fd9372babb2bf7d22b8f9a1da2a253
@@ -857,6 +883,7 @@ xxh3-128|0x00_to_0xff|4913|seed|9b1e87e9ce5528df|509a4c7ef1a7568996e6e9c62223d75
857
883
  xxh3-128|0x00_to_0xff|4913|seed|8ca1890dbfe64268|9da90582274af62f842853d50e2d42f8
858
884
  xxh3-128|0x00_to_0xff|4913|seed|41992d0fb054bb16|c5a1feca89846b9d3478ed950eea71a2
859
885
  xxh3-128|0x00_to_0xff|83521|seed|0000000000000000|82d664b52c169000b0281ef3f89126cc
886
+ xxh3-128|0x00_to_0xff|83521|seed|ffffffffffffffff|873443ddbc68c42d16f889f26216ec87
860
887
  xxh3-128|0x00_to_0xff|83521|seed|637c777bf26b6fc5|e5bdd327058f897e1d20bfdeee418090
861
888
  xxh3-128|0x00_to_0xff|83521|seed|3001672bfed7ab76|c145cac6e747ed58c45a140b80416735
862
889
  xxh3-128|0x00_to_0xff|83521|seed|ca82c97dfa5947f0|9ef403b3711962346aa5924f9aa66211
@@ -890,6 +917,7 @@ xxh3-128|0x00_to_0xff|83521|seed|9b1e87e9ce5528df|365690079811aad8d82602ed2359a8
890
917
  xxh3-128|0x00_to_0xff|83521|seed|8ca1890dbfe64268|c6c8560f5cd25c147c13267f59f6fc64
891
918
  xxh3-128|0x00_to_0xff|83521|seed|41992d0fb054bb16|07a38dbdd56868c119434a5aabe574a3
892
919
  xxh3-128|0x00_to_0xff|1419857|seed|0000000000000000|640fbfc6975861b8ca08ebf4a4461aff
920
+ xxh3-128|0x00_to_0xff|1419857|seed|ffffffffffffffff|a3834b6efe1e471e1fceafa7d65bc018
893
921
  xxh3-128|0x00_to_0xff|1419857|seed|637c777bf26b6fc5|7ab6ea1927b9e8ef746df9df0e51bf12
894
922
  xxh3-128|0x00_to_0xff|1419857|seed|3001672bfed7ab76|d7b694f22561e165e1df015be53e2881
895
923
  xxh3-128|0x00_to_0xff|1419857|seed|ca82c97dfa5947f0|c2501231d2538209ab406958f59d2c1b
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.6
4
+ version: 0.2.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - konsolebox
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-06-22 00:00:00.000000000 Z
11
+ date: 2024-05-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -30,32 +30,20 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '1.0'
34
- - - "!="
35
- - !ruby/object:Gem::Version
36
- version: 1.1.3
37
- - - "!="
38
- - !ruby/object:Gem::Version
39
- version: 1.1.4
40
- - - "!="
33
+ version: '1.2'
34
+ - - ">="
41
35
  - !ruby/object:Gem::Version
42
- version: 1.1.5
36
+ version: 1.2.3
43
37
  type: :development
44
38
  prerelease: false
45
39
  version_requirements: !ruby/object:Gem::Requirement
46
40
  requirements:
47
41
  - - "~>"
48
42
  - !ruby/object:Gem::Version
49
- version: '1.0'
50
- - - "!="
51
- - !ruby/object:Gem::Version
52
- version: 1.1.3
53
- - - "!="
54
- - !ruby/object:Gem::Version
55
- version: 1.1.4
56
- - - "!="
43
+ version: '1.2'
44
+ - - ">="
57
45
  - !ruby/object:Gem::Version
58
- version: 1.1.5
46
+ version: 1.2.3
59
47
  - !ruby/object:Gem::Dependency
60
48
  name: minitest
61
49
  requirement: !ruby/object:Gem::Requirement
@@ -117,7 +105,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
117
105
  - !ruby/object:Gem::Version
118
106
  version: '0'
119
107
  requirements: []
120
- rubygems_version: 3.4.10
108
+ rubygems_version: 3.4.14
121
109
  signing_key:
122
110
  specification_version: 4
123
111
  summary: A Digest framework based XXHash library for Ruby