diff --git a/doc/configuration.txt b/doc/configuration.txt index fc8304c8f..43c91114c 100644 --- a/doc/configuration.txt +++ b/doc/configuration.txt @@ -12847,7 +12847,17 @@ crc32([]) found in Ethernet, Gzip, PNG, etc... It is slower than the other algorithms but may provide a better or at least less predictable distribution. It must not be used for security purposes as a 32-bit hash is trivial to break. See - also "djb2", "sdbm", "wt6" and the "hash-type" directive. + also "djb2", "sdbm", "wt6", "crc32c" and the "hash-type" directive. + +crc32c([]) + Hashes a binary input sample into an unsigned 32-bit quantity using the CRC32C + hash function. Optionally, it is possible to apply a full avalanche hash + function to the output if the optional argument equals 1. This + converter uses the same functions as described in RFC4960, Appendix B [8]. + It is provided for compatibility with other software which want a CRC32C to be + computed on some input keys. It is slower than the other algorithms and it must + not be used for security purposes as a 32-bit hash is trivial to break. See + also "djb2", "sdbm", "wt6", "crc32" and the "hash-type" directive. da-csv-conv([,*]) Asks the DeviceAtlas converter to identify the User Agent string passed on @@ -12890,8 +12900,8 @@ djb2([]) balancing algorithms, so it will provide exactly the same results. It is mostly intended for debugging, but can be used as a stick-table entry to collect rough statistics. It must not be used for security purposes as a - 32-bit hash is trivial to break. See also "crc32", "sdbm", "wt6" and the - "hash-type" directive. + 32-bit hash is trivial to break. See also "crc32", "sdbm", "wt6", "crc32c", + and the "hash-type" directive. even Returns a boolean TRUE if the input value of type signed integer is even @@ -13199,8 +13209,8 @@ sdbm([]) balancing algorithms, so it will provide exactly the same results. It is mostly intended for debugging, but can be used as a stick-table entry to collect rough statistics. It must not be used for security purposes as a - 32-bit hash is trivial to break. See also "crc32", "djb2", "wt6" and the - "hash-type" directive. + 32-bit hash is trivial to break. See also "crc32", "djb2", "wt6", "crc32c", + and the "hash-type" directive. set-var() Sets a variable with the input content and returns the content on the output @@ -13442,8 +13452,8 @@ wt6([]) balancing algorithms, so it will provide exactly the same results. It is mostly intended for debugging, but can be used as a stick-table entry to collect rough statistics. It must not be used for security purposes as a - 32-bit hash is trivial to break. See also "crc32", "djb2", "sdbm", and the - "hash-type" directive. + 32-bit hash is trivial to break. See also "crc32", "djb2", "sdbm", "crc32c", + and the "hash-type" directive. xor() Performs a bitwise "XOR" (exclusive OR) between and the input value diff --git a/src/sample.c b/src/sample.c index 3e1a156f0..71ee59f0b 100644 --- a/src/sample.c +++ b/src/sample.c @@ -1743,6 +1743,16 @@ static int sample_conv_crc32(const struct arg *arg_p, struct sample *smp, void * return 1; } +/* hashes the binary input into crc32c (RFC4960, Appendix B [8].) */ +static int sample_conv_crc32c(const struct arg *arg_p, struct sample *smp, void *private) +{ + smp->data.u.sint = hash_crc32c(smp->data.u.str.str, smp->data.u.str.len); + if (arg_p && arg_p->data.sint) + smp->data.u.sint = full_hash(smp->data.u.sint); + smp->data.type = SMP_T_SINT; + return 1; +} + /* This function escape special json characters. The returned string can be * safely set between two '"' and used as json string. The json string is * defined like this: @@ -2910,6 +2920,7 @@ static struct sample_conv_kw_list sample_conv_kws = {ILH, { { "ltime", sample_conv_ltime, ARG2(1,STR,SINT), NULL, SMP_T_SINT, SMP_T_STR }, { "utime", sample_conv_utime, ARG2(1,STR,SINT), NULL, SMP_T_SINT, SMP_T_STR }, { "crc32", sample_conv_crc32, ARG1(0,SINT), NULL, SMP_T_BIN, SMP_T_SINT }, + { "crc32c", sample_conv_crc32c, ARG1(0,SINT), NULL, SMP_T_BIN, SMP_T_SINT }, { "djb2", sample_conv_djb2, ARG1(0,SINT), NULL, SMP_T_BIN, SMP_T_SINT }, { "sdbm", sample_conv_sdbm, ARG1(0,SINT), NULL, SMP_T_BIN, SMP_T_SINT }, { "wt6", sample_conv_wt6, ARG1(0,SINT), NULL, SMP_T_BIN, SMP_T_SINT },