constexpr karma işlevi
Sep 01 2020
İşte constexprbir dizgeyi mevcut en büyük işaretsiz integral tipine paketleyecek bir hash fonksiyonu. Yani ne düşünüyorsun?
#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
Yanıtlar
3 G.Sliepen Sep 02 2020 at 00:44
Kodunuz çok karmaşık. C ++ 17 ile daha karmaşık constexpr işlevleri yazabilirsiniz, böylece değişken şablon numaralarına ihtiyacınız olmaz:
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;
}
Bunun dışında, bu korkunç bir hash fonksiyonudur! Çıktı, girişle oldukça ilişkilidir. Ayrıca en fazla sizeof(T)karaktere kadar hash oluşturacaktır , bu nedenle ortak bir öneki olan uzun dizelerin tümü aynı hash değerini alabilir.
Nicole Kidman, Michael Keaton ve Val Kilmer'in Batman Olarak Paylaştığı Bu 1 Çekici Özelliğe Bayıldı
Gene Simmons, KISS Çizgi Romanlarının Potansiyel Olarak "İnsanlığı Yeniden Yaratabileceğini" Söyledi
Tom Girardi Dolandırıcılık Suçlamalarından Yargılanma Yetkisinin Belirlenmesi İçin Duruşmaya Katıldı
Kevin Jonas'ın Kızı Alena, Doğum Günü Fotoğrafında Büyümüş Görünüyor: '9 Yaşında Gerçek Hissetmiyor'