*/
#include "rsync.h"
+
#ifdef SUPPORT_XXHASH
#include "xxhash.h"
+# if XXH_VERSION_NUMBER >= 800
+# define SUPPORT_XXH3 1
+# endif
#endif
extern int am_server;
struct name_num_obj valid_checksums = {
"checksum", NULL, NULL, 0, 0, {
+#ifdef SUPPORT_XXH3
+ { CSUM_XXH3_128, "xxh128", NULL },
+ { CSUM_XXH3_64, "xxh3", NULL },
+#endif
#ifdef SUPPORT_XXHASH
{ CSUM_XXH64, "xxh64", NULL },
{ CSUM_XXH64, "xxhash", NULL },
return MD4_DIGEST_LEN;
case CSUM_MD5:
return MD5_DIGEST_LEN;
-#ifdef SUPPORT_XXHASH
case CSUM_XXH64:
+ case CSUM_XXH3_64:
return 64/8;
-#endif
+ case CSUM_XXH3_128:
+ return 128/8;
default: /* paranoia to prevent missing case values */
exit_cleanup(RERR_UNSUPPORTED);
}
case CSUM_MD4:
case CSUM_MD5:
return -1;
-#ifdef SUPPORT_XXHASH
case CSUM_XXH64:
+ case CSUM_XXH3_64:
+ case CSUM_XXH3_128:
return 1;
-#endif
default: /* paranoia to prevent missing case values */
exit_cleanup(RERR_UNSUPPORTED);
}
case CSUM_XXH64:
SIVAL64(sum, 0, XXH64(buf, len, checksum_seed));
break;
+#endif
+#ifdef SUPPORT_XXH3
+ case CSUM_XXH3_64:
+ SIVAL64(sum, 0, XXH3_64bits_withSeed(buf, len, checksum_seed));
+ break;
+ case CSUM_XXH3_128: {
+ XXH128_hash_t digest = XXH3_128bits_withSeed(buf, len, checksum_seed);
+ SIVAL64(sum, 0, digest.low64);
+ SIVAL64(sum, 8, digest.high64);
+ break;
+ }
#endif
case CSUM_MD5: {
MD5_CTX m5;
SIVAL64(sum, 0, XXH64_digest(state));
break;
}
+#endif
+#ifdef SUPPORT_XXH3
+ case CSUM_XXH3_64: {
+ static XXH3_state_t* state = NULL;
+ if (!state && !(state = XXH3_createState()))
+ out_of_memory("file_checksum");
+
+ XXH3_64bits_reset(state);
+
+ for (i = 0; i + CHUNK_SIZE <= len; i += CHUNK_SIZE)
+ XXH3_64bits_update(state, (uchar *)map_ptr(buf, i, CHUNK_SIZE), CHUNK_SIZE);
+
+ remainder = (int32)(len - i);
+ if (remainder > 0)
+ XXH3_64bits_update(state, (uchar *)map_ptr(buf, i, remainder), remainder);
+
+ SIVAL64(sum, 0, XXH3_64bits_digest(state));
+ break;
+ }
+ case CSUM_XXH3_128: {
+ XXH128_hash_t digest;
+ static XXH3_state_t* state = NULL;
+ if (!state && !(state = XXH3_createState()))
+ out_of_memory("file_checksum");
+
+ XXH3_128bits_reset(state);
+
+ for (i = 0; i + CHUNK_SIZE <= len; i += CHUNK_SIZE)
+ XXH3_128bits_update(state, (uchar *)map_ptr(buf, i, CHUNK_SIZE), CHUNK_SIZE);
+
+ remainder = (int32)(len - i);
+ if (remainder > 0)
+ XXH3_128bits_update(state, (uchar *)map_ptr(buf, i, remainder), remainder);
+
+ digest = XXH3_128bits_digest(state);
+ SIVAL64(sum, 0, digest.low64);
+ SIVAL64(sum, 8, digest.high64);
+ break;
+ }
#endif
case CSUM_MD5: {
MD5_CTX m5;
#ifdef SUPPORT_XXHASH
static XXH64_state_t* xxh64_state;
#endif
+#ifdef SUPPORT_XXH3
+static XXH3_state_t* xxh3_state;
+#endif
static int cursum_type;
void sum_init(int csum_type, int seed)
out_of_memory("sum_init");
XXH64_reset(xxh64_state, 0);
break;
+#endif
+#ifdef SUPPORT_XXH3
+ case CSUM_XXH3_64:
+ if (!xxh3_state && !(xxh3_state = XXH3_createState()))
+ out_of_memory("sum_init");
+ XXH3_64bits_reset(xxh3_state);
+ break;
+ case CSUM_XXH3_128:
+ if (!xxh3_state && !(xxh3_state = XXH3_createState()))
+ out_of_memory("sum_init");
+ XXH3_128bits_reset(xxh3_state);
+ break;
#endif
case CSUM_MD5:
MD5_Init(&ctx.m5);
case CSUM_XXH64:
XXH64_update(xxh64_state, p, len);
break;
+#endif
+#ifdef SUPPORT_XXH3
+ case CSUM_XXH3_64:
+ XXH3_64bits_update(xxh3_state, p, len);
+ break;
+ case CSUM_XXH3_128:
+ XXH3_128bits_update(xxh3_state, p, len);
+ break;
#endif
case CSUM_MD5:
MD5_Update(&ctx.m5, (uchar *)p, len);
case CSUM_XXH64:
SIVAL64(sum, 0, XXH64_digest(xxh64_state));
break;
+#endif
+#ifdef SUPPORT_XXH3
+ case CSUM_XXH3_64:
+ SIVAL64(sum, 0, XXH3_64bits_digest(xxh3_state));
+ break;
+ case CSUM_XXH3_128: {
+ XXH128_hash_t digest = XXH3_128bits_digest(xxh3_state);
+ SIVAL64(sum, 0, digest.low64);
+ SIVAL64(sum, 8, digest.high64);
+ break;
+ }
#endif
case CSUM_MD5:
MD5_Final((uchar *)sum, &ctx.m5);