From aa5509a58cb0d0a6ccdf1239132d26fad467f8bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Zaoral?= Date: Tue, 27 Aug 2024 10:09:54 +0200 Subject: [PATCH] hash-util: make the code work with boost-1.86 ... where `TEng::digest_type` expands to an array of chars rather than an array of ints. This caused each byte in the resulting hash string to be prepended by 3 zero bytes, which was detected by the CI on macOS: ``` --- /Users/runner/work/csdiff/csdiff/tests/csgrep/0036-csgrep-json-stdout.txt 2024-08-26 16:59:02 +++ - 2024-08-26 17:00:30 @@ -4,7 +4,7 @@ "checker": "SHELLCHECK_WARNING", "language": "shell", "tool": "shellcheck", - "hash_v1": "b6311c1fdc52c47d4279cd6650af36e6f8299960", + "hash_v1": "000000b6000000310000001c0000001f000000dc00000052000000c40000007d0000004200000079000000cd0000006600000050000000af00000036000000e6000000f8000000290000009900000060", "key_event_idx": 0, "events": [ { ``` Also use the `hex_lower` algorithm to optimize out the extra traversal step to lower the output string. --- src/lib/hash-util.hh | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/lib/hash-util.hh b/src/lib/hash-util.hh index 3f41fc6f..a438578d 100644 --- a/src/lib/hash-util.hh +++ b/src/lib/hash-util.hh @@ -32,18 +32,17 @@ std::string hexHashStr(const TSrc &src) eng.process_bytes(src.data(), src.size()); // export the hash as an array of unsigned int - typename TEng::digest_type dst; + using TDst = typename TEng::digest_type; + TDst dst; eng.get_digest(dst); // convert the hash to a vector of unsigned int static const size_t len = sizeof(dst) / sizeof(dst[0]); - const std::vector hash(dst, dst + len); + using TElem = typename std::remove_extent::type; + const std::vector hash(dst, dst + len); // convert the hash to a hex string std::string result; - boost::algorithm::hex(hash.begin(), hash.end(), back_inserter(result)); - - // convert uppercase letters to lowercase - boost::algorithm::to_lower(result); + boost::algorithm::hex_lower(hash.begin(), hash.end(), back_inserter(result)); return result; }