constexpr hash function
Your code is too complex. With C++17, you can write more complex constexpr functions, so you don't need the variadic template tricks:
template &lt;typename T = std::uintmax_t, std::size_t N&gt;
constexpr T hash(char const(&amp;s)[N]) noexcept
{
  T val{};

  for (size_t i = 0; i &lt; N; ++i)
    val |= s[i] &lt;&lt; (i * CHAR_BIT);

  return val;
}

Apart from that, this is a terrible hash function! The output is highly correlated to the input. It will also only hash up to sizeof(T) characters, so long strings with a common prefix might all get the same hash value.