diff --git a/include/mosquitto/broker.h b/include/mosquitto/broker.h index 672db3ef..e5efb95c 100644 --- a/include/mosquitto/broker.h +++ b/include/mosquitto/broker.h @@ -616,6 +616,14 @@ mosq_EXPORT bool mosquitto_client_clean_session(const struct mosquitto *client); mosq_EXPORT const char *mosquitto_client_id(const struct mosquitto *client); +/* + * Function: mosquitto_client_id_hashv + * + * Retrieve the hash value associated with a client id. + */ +mosq_EXPORT unsigned mosquitto_client_id_hashv(const struct mosquitto *client); + + /* * Function: mosquitto_client_keepalive * diff --git a/lib/mosquitto_internal.h b/lib/mosquitto_internal.h index 910c6dd5..64d20fb8 100644 --- a/lib/mosquitto_internal.h +++ b/lib/mosquitto_internal.h @@ -302,6 +302,7 @@ struct mosquitto { char *id; char *username; char *password; + unsigned id_hashv; uint16_t keepalive; uint16_t last_mid; enum mosquitto_client_state state; diff --git a/src/context.c b/src/context.c index ce1deccf..f2b2d7c9 100644 --- a/src/context.c +++ b/src/context.c @@ -329,7 +329,8 @@ void context__add_to_by_id(struct mosquitto *context) { if(context->in_by_id == false){ context->in_by_id = true; - HASH_ADD_KEYPTR(hh_id, db.contexts_by_id, context->id, strlen(context->id), context); + HASH_VALUE(context->id, strlen(context->id), context->id_hashv); + HASH_ADD_KEYPTR_BYHASHVALUE(hh_id, db.contexts_by_id, context->id, strlen(context->id), context->id_hashv, context); } } @@ -348,6 +349,7 @@ void context__remove_from_by_id(struct mosquitto *context) if(context_found){ HASH_DELETE(hh_id, db.contexts_by_id, context_found); } + context->id_hashv = 0; context->in_by_id = false; } } diff --git a/src/linker-macosx.syms b/src/linker-macosx.syms index fea51df1..dbae1332 100644 --- a/src/linker-macosx.syms +++ b/src/linker-macosx.syms @@ -10,6 +10,7 @@ _mosquitto_client_address _mosquitto_client_certificate _mosquitto_client_clean_session _mosquitto_client_id +_mosquitto_client_id_hashv _mosquitto_client_keepalive _mosquitto_client_port _mosquitto_client_protocol diff --git a/src/linker.syms b/src/linker.syms index 9867f369..e0823a88 100644 --- a/src/linker.syms +++ b/src/linker.syms @@ -11,6 +11,7 @@ mosquitto_client_certificate; mosquitto_client_clean_session; mosquitto_client_id; + mosquitto_client_id_hashv; mosquitto_client_keepalive; mosquitto_client_port; mosquitto_client_protocol; diff --git a/src/plugin_public.c b/src/plugin_public.c index fe3054f9..2541d31d 100644 --- a/src/plugin_public.c +++ b/src/plugin_public.c @@ -104,6 +104,16 @@ BROKER_EXPORT const char *mosquitto_client_id(const struct mosquitto *client) } +BROKER_EXPORT unsigned mosquitto_client_id_hashv(const struct mosquitto *client) +{ + if(client){ + return client->id_hashv; + }else{ + return 0; + } +} + + BROKER_EXPORT int mosquitto_client_keepalive(const struct mosquitto *client) { if(client){