From a7e4acc519af5a75242b23e9e30972f0cf4b8600 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Thu, 8 Nov 2018 17:04:15 -0800 Subject: [PATCH] ircd: Split and reorg ircd::hash/ircd::crh related headers and units. --- include/ircd/{hash.h => crh.h} | 43 +--------------------------- include/ircd/ircd.h | 2 +- include/ircd/util/hash.h | 52 ++++++++++++++++++++++++++++++++++ include/ircd/util/util.h | 1 + ircd/Makefile.am | 2 +- ircd/{hash.cc => crh.cc} | 8 ++++++ 6 files changed, 64 insertions(+), 44 deletions(-) rename include/ircd/{hash.h => crh.h} (70%) create mode 100644 include/ircd/util/hash.h rename ircd/{hash.cc => crh.cc} (70%) diff --git a/include/ircd/hash.h b/include/ircd/crh.h similarity index 70% rename from include/ircd/hash.h rename to include/ircd/crh.h index 9dcbf682f..dac06588e 100644 --- a/include/ircd/hash.h +++ b/include/ircd/crh.h @@ -9,20 +9,7 @@ // full license for this software is available in the LICENSE file. #pragma once -#define HAVE_IRCD_HASH_H - -namespace ircd -{ - // constexpr bernstein string hasher suite; these functions will hash the - // string at compile time leaving an integer residue at runtime. Decent - // primes are at least 7681 and 5381. - template constexpr size_t hash(const char16_t *const str, const size_t i = 0); - template constexpr size_t hash(const string_view str, const size_t i = 0); - - // Note that at runtime this hash uses multiplication on every character - // which can consume many cycles... - template size_t hash(const std::u16string &str, const size_t i = 0); -} +#define HAVE_IRCD_CRH_H /// Collision-Resistant Hashing /// @@ -40,7 +27,6 @@ namespace ircd::crh // Export aliases down to ircd:: namespace ircd { - using crh::hash; using crh::sha256; using crh::ripemd160; } @@ -155,30 +141,3 @@ const } }; } - -/// Runtime hashing of a std::u16string (for js). Non-cryptographic. -template -size_t -ircd::hash(const std::u16string &str, - const size_t i) -{ - return i >= str.size()? PRIME : (hash(str, i+1) * 33ULL) ^ str.at(i); -} - -/// Runtime hashing of a string_view. Non-cryptographic. -template -constexpr size_t -ircd::hash(const string_view str, - const size_t i) -{ - return i >= str.size()? PRIME : (hash(str, i+1) * 33ULL) ^ str.at(i); -} - -/// Compile-time hashing of a wider string literal (for js). Non-cryptographic. -template -constexpr size_t -ircd::hash(const char16_t *const str, - const size_t i) -{ - return !str[i]? PRIME : (hash(str, i+1) * 33ULL) ^ str[i]; -} diff --git a/include/ircd/ircd.h b/include/ircd/ircd.h index bf59e1b0a..f2c9e8a7e 100644 --- a/include/ircd/ircd.h +++ b/include/ircd/ircd.h @@ -43,7 +43,7 @@ namespace ircd #include "info.h" #include "nacl.h" #include "rand.h" -#include "hash.h" +#include "crh.h" #include "ed25519.h" #include "color.h" #include "lex_cast.h" diff --git a/include/ircd/util/hash.h b/include/ircd/util/hash.h new file mode 100644 index 000000000..a5e4efd3a --- /dev/null +++ b/include/ircd/util/hash.h @@ -0,0 +1,52 @@ +// Matrix Construct +// +// Copyright (C) Matrix Construct Developers, Authors & Contributors +// Copyright (C) 2016-2018 Jason Volk +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice is present in all copies. The +// full license for this software is available in the LICENSE file. + +#pragma once +#define HAVE_IRCD_UTIL_HASH_H + +namespace ircd::util +{ + // constexpr bernstein string hasher suite; these functions will hash the + // string at compile time leaving an integer residue at runtime. Decent + // primes are at least 7681 and 5381. + template constexpr size_t hash(const char16_t *const str, const size_t i = 0); + template constexpr size_t hash(const string_view str, const size_t i = 0); + + // Note that at runtime this hash uses multiplication on every character + // which can consume many cycles... + template size_t hash(const std::u16string &str, const size_t i = 0); +} + +/// Runtime hashing of a std::u16string (for js). Non-cryptographic. +template +size_t +ircd::util::hash(const std::u16string &str, + const size_t i) +{ + return i >= str.size()? PRIME : (hash(str, i+1) * 33ULL) ^ str.at(i); +} + +/// Runtime hashing of a string_view. Non-cryptographic. +template +constexpr size_t +ircd::util::hash(const string_view str, + const size_t i) +{ + return i >= str.size()? PRIME : (hash(str, i+1) * 33ULL) ^ str.at(i); +} + +/// Compile-time hashing of a wider string literal (for js). Non-cryptographic. +template +constexpr size_t +ircd::util::hash(const char16_t *const str, + const size_t i) +{ + return !str[i]? PRIME : (hash(str, i+1) * 33ULL) ^ str[i]; +} diff --git a/include/ircd/util/util.h b/include/ircd/util/util.h index 12bf94c24..471229655 100644 --- a/include/ircd/util/util.h +++ b/include/ircd/util/util.h @@ -54,6 +54,7 @@ namespace ircd #include "what.h" #include "u2a.h" #include "pretty.h" +#include "hash.h" // Unsorted section namespace ircd { diff --git a/ircd/Makefile.am b/ircd/Makefile.am index 298b0f764..c25525d29 100644 --- a/ircd/Makefile.am +++ b/ircd/Makefile.am @@ -102,7 +102,7 @@ libircd_la_SOURCES = \ conf.cc \ rfc1459.cc \ rand.cc \ - hash.cc \ + crh.cc \ base.cc \ parse.cc \ openssl.cc \ diff --git a/ircd/hash.cc b/ircd/crh.cc similarity index 70% rename from ircd/hash.cc rename to ircd/crh.cc index e2967a1f2..83b900673 100644 --- a/ircd/hash.cc +++ b/ircd/crh.cc @@ -8,6 +8,14 @@ // copyright notice and this permission notice is present in all copies. The // full license for this software is available in the LICENSE file. +// +// This file anchors the abstract ircd::crh::hash vtable and default +// functionalities. Various implementations of crh::hash will be contained +// within other units where the third-party dependency which implements it +// is included (ex. openssl.cc). This is so we don't include and mix +// everything here just for hash functions. +// + ircd::crh::hash::~hash() noexcept {