https://github.com/ClickHouse/ClickHouse/blob/9a48cf0da8badfc5f3da08611eb44961aa28e3f6/src/Functions/FunctionsHashing.h#L669-L671

There's a call to `blake3_free_char_pointer` that passes ownership of the pointer back to Rust (which then frees the memory), then there's a call to `std::string`'s constructor that accepts that now-freed pointer.
{
        
        return intHash32<0x75D9543DE018BF45ULL>(x);
    }
};
struct IntHash64Impl
{
    using ReturnType = UInt64;
    static UInt64 apply(UInt64 x)
    {
        return intHash64(x ^ 0x4CF2D2BAAE6DA887ULL);
    }
};
template<typename T, typename HashFunction>
T combineHashesFunc(T t1, T t2)
{
    T hashes[] = {t1, t2};
    return HashFunction::apply(reinterpret_cast<const char *>(hashes), 2 * sizeof(T));
}
#if USE_SSL
struct HalfMD5Impl
{
    static constexpr auto name = "halfMD5";
    using ReturnType = UInt64;
    static UInt64 apply(const char * begin, size_t size)