From 9d438efa67f6119d9dd3e7c998ad2652cb9c5853 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20Nu=C3=9Fbaum?= Date: Fri, 1 Jul 2022 12:04:52 +0200 Subject: [PATCH] simplified hash calculation for varchars in constant time --- .../nec/cyclone/cpp/cyclone/transfer-definitions.hpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/resources/com/nec/cyclone/cpp/cyclone/transfer-definitions.hpp b/src/main/resources/com/nec/cyclone/cpp/cyclone/transfer-definitions.hpp index bde77421c..a430f827c 100644 --- a/src/main/resources/com/nec/cyclone/cpp/cyclone/transfer-definitions.hpp +++ b/src/main/resources/com/nec/cyclone/cpp/cyclone/transfer-definitions.hpp @@ -28,6 +28,7 @@ #include #include #include +#include inline void set_valid_bit(uint64_t * buffer, const size_t idx, @@ -242,11 +243,12 @@ struct nullable_varchar_vector { int64_t out = seed; auto start = offsets[idx]; auto end = offsets[idx] + lengths[idx]; - #pragma _NEC vector - #pragma _NEC ivdep - for (int x = start; x < end; x++) { - out = 31 * out + data[x]; - } + auto median = (end+start) / 2; + + // simplified hash in constant time: + // sample first, median and last element in varchar + out = 31*(31*(31*seed+data[start])+data[median])+data[end-1]; + return out; }