From 22fbb11f90ca58bbc27f31a892eb12a44e636799 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Dziepak?= Date: Mon, 30 Jan 2017 10:55:27 +0000 Subject: [PATCH] add fnv1a hasher --- fnv1a_hasher.hh | 54 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 fnv1a_hasher.hh diff --git a/fnv1a_hasher.hh b/fnv1a_hasher.hh new file mode 100644 index 0000000000..b6e33deb68 --- /dev/null +++ b/fnv1a_hasher.hh @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2017 ScyllaDB + */ + +/* + * This file is part of Scylla. + * + * Scylla is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Scylla is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Scylla. If not, see . + */ + +#pragma once + +// FIXME: FNV-1a is quite slow, consider something faster, CityHash seems to be +// a good choice. + +template +struct fnv1a_constants { }; + +template<> +struct fnv1a_constants<8> { + enum : uint64_t { + offset = 0xcbf29ce484222325ull, + prime = 0x100000001b3ull, + }; +}; + +class fnv1a_hasher { + using constants = fnv1a_constants; + size_t _hash = constants::offset; +public: + void update(const char* ptr, size_t length) { + auto end = ptr + length; + while (ptr != end) { + _hash ^= *ptr; + _hash *= constants::prime; + ++ptr; + } + } + + size_t finalize() const { + return _hash; + } +};