constexpr हैश फ़ंक्शन

Sep 01 2020

यहाँ एक constexprहैश फ़ंक्शन है, जो उपलब्ध सबसे बड़ी अहस्ताक्षरित अभिन्न प्रकार में एक स्ट्रिंग पैक करेगा। तो तुम क्या सोचते हो?

#include <climits>

#include <cstdint>

#include <utility>

#include <iostream>

namespace detail
{

template <typename T, std::size_t ...I>
constexpr T hash(char const* const s, std::size_t const N,
  std::index_sequence<I...>) noexcept
{
  return ((T(s[I < N ? I : 0]) << ((I < N ? I : 0) * CHAR_BIT)) | ...);
}

}

template <typename T = std::uintmax_t>
constexpr T hash(char const* const s, std::size_t const N) noexcept
{
  return detail::hash<T>(s, N, std::make_index_sequence<sizeof(T)>());
}

template <typename T = std::uintmax_t, std::size_t N>
constexpr T hash(char const(&s)[N]) noexcept
{
  return hash<T>(s, N - 1);
}

int main()
{
  std::cout << (hash("a") == 'a') << std::endl;

  return 0;
}

https://wandbox.org/permlink/KbPiWJc434xYLL3q

जवाब

3 G.Sliepen Sep 02 2020 at 00:44

आपका कोड बहुत जटिल है। C ++ 17 के साथ, आप अधिक जटिल बाधा कार्य लिख सकते हैं, इसलिए आपको वैरिएड टेम्पलेट ट्रिक्स की आवश्यकता नहीं है:

template <typename T = std::uintmax_t, std::size_t N>
constexpr T hash(char const(&s)[N]) noexcept
{
  T val{};

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

  return val;
}

इसके अलावा, यह एक भयानक हैश फ़ंक्शन है! आउटपुट इनपुट से बहुत सहसंबद्ध है। यह केवल sizeof(T)वर्णों तक हैश होगा , इसलिए एक सामान्य उपसर्ग के साथ लंबे तार सभी को समान हैश मान मिल सकता है।