diff --git a/doc/configuration.txt b/doc/configuration.txt index d0643574b..73652aa9b 100644 --- a/doc/configuration.txt +++ b/doc/configuration.txt @@ -6060,6 +6060,10 @@ hash-type a better distribution or less predictable results especially when used on strings. + none don't hash the key, the key will be used as a hash, this can be + useful to manually hash the key using a converter for that purpose + and let haproxy use the result directly. + indicates an optional method applied after hashing the key : avalanche This directive indicates that the result from the hash diff --git a/include/haproxy/backend-t.h b/include/haproxy/backend-t.h index cce451a33..8d5973871 100644 --- a/include/haproxy/backend-t.h +++ b/include/haproxy/backend-t.h @@ -118,11 +118,12 @@ #define BE_LB_HASH_MOD 0x200000 /* get/clear hash modifier */ /* BE_LB_HFCN_* is the hash function, to be used with BE_LB_HASH_FUNC */ -#define BE_LB_HFCN_SDBM 0x000000 /* sdbm hash */ -#define BE_LB_HFCN_DJB2 0x400000 /* djb2 hash */ -#define BE_LB_HFCN_WT6 0x800000 /* wt6 hash */ -#define BE_LB_HFCN_CRC32 0xC00000 /* crc32 hash */ -#define BE_LB_HASH_FUNC 0xC00000 /* get/clear hash function */ +#define BE_LB_HFCN_SDBM 0x000000 /* sdbm hash */ +#define BE_LB_HFCN_DJB2 0x400000 /* djb2 hash */ +#define BE_LB_HFCN_WT6 0x800000 /* wt6 hash */ +#define BE_LB_HFCN_CRC32 0xC00000 /* crc32 hash */ +#define BE_LB_HFCN_NONE 0x1000000 /* none - no hash */ +#define BE_LB_HASH_FUNC 0x1C00000 /* get/clear hash function */ /* various constants */ diff --git a/src/backend.c b/src/backend.c index e0b5a5877..e7e8d29ed 100644 --- a/src/backend.c +++ b/src/backend.c @@ -84,6 +84,14 @@ static unsigned int gen_hash(const struct proxy* px, const char* key, unsigned l case BE_LB_HFCN_CRC32: hash = hash_crc32(key, len); break; + case BE_LB_HFCN_NONE: + /* use key as a hash */ + { + const char *_key = key; + + hash = read_int64(&_key, _key + len); + } + break; case BE_LB_HFCN_SDBM: /* this is the default hash function */ default: diff --git a/src/cfgparse-listen.c b/src/cfgparse-listen.c index cddb9fc79..f039a4eb3 100644 --- a/src/cfgparse-listen.c +++ b/src/cfgparse-listen.c @@ -2624,6 +2624,9 @@ int cfg_parse_listen(const char *file, int linenum, char **args, int kwm) else if (strcmp(args[2], "crc32") == 0) { curproxy->lbprm.algo |= BE_LB_HFCN_CRC32; } + else if (strcmp(args[2], "none") == 0) { + curproxy->lbprm.algo |= BE_LB_HFCN_NONE; + } else { ha_alert("parsing [%s:%d] : '%s' only supports 'sdbm', 'djb2', 'crc32', or 'wt6' hash functions.\n", file, linenum, args[0]); err_code |= ERR_ALERT | ERR_FATAL;