diff --git a/c/opendht.cpp b/c/opendht.cpp
index 6c5d77fcee860f5966c62a1da8bce16622ef4079..0524a72e5adcb64aabef444b6cbf810ceabd6ea7 100644
--- a/c/opendht.cpp
+++ b/c/opendht.cpp
@@ -95,14 +95,16 @@ int dht_publickey_pack(dht_publickey* pk, char* out, size_t* outlen) {
 }
 
 dht_infohash dht_publickey_get_id(const dht_publickey* pk) {
+    auto pkey = reinterpret_cast<const dht::crypto::PublicKey*>(pk);
     dht_infohash h;
-    *reinterpret_cast<dht::InfoHash*>(&h) = reinterpret_cast<const dht::crypto::PublicKey*>(pk)->getId();
+    *reinterpret_cast<dht::InfoHash*>(&h) = pkey->getId();
     return h;
 }
 
 dht_pkid dht_publickey_get_long_id(const dht_publickey* pk) {
+    auto pkey = reinterpret_cast<const dht::crypto::PublicKey*>(pk);
     dht_pkid h;
-    *reinterpret_cast<dht::PkId*>(&h) = reinterpret_cast<const dht::crypto::PublicKey*>(pk)->getLongId();
+    *reinterpret_cast<dht::PkId*>(&h) = pkey->getLongId();
     return h;
 }
 
@@ -278,6 +280,20 @@ void dht_runner_shutdown(dht_runner* r, dht_shutdown_cb done_cb, void* cb_user_d
     });
 }
 
+dht_infohash dht_runner_get_node_id(const dht_runner* r) {
+    auto runner = reinterpret_cast<const dht::DhtRunner*>(r);
+    dht_infohash ret;
+    *reinterpret_cast<dht::InfoHash*>(&ret) = runner->getNodeId();
+    return ret;
+}
+
+dht_infohash dht_runner_get_id(const dht_runner* r) {
+    auto runner = reinterpret_cast<const dht::DhtRunner*>(r);
+    dht_infohash ret;
+    *reinterpret_cast<dht::InfoHash*>(&ret) = runner->getId();
+    return ret;
+}
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/c/opendht_c.h b/c/opendht_c.h
index c70bee4e4808c98b2de24ccbd839df9258685577..d142aab9c344653b05315bdefea42460c93b8925 100644
--- a/c/opendht_c.h
+++ b/c/opendht_c.h
@@ -135,6 +135,8 @@ OPENDHT_C_PUBLIC void dht_runner_put(dht_runner* runner, const dht_infohash* has
 OPENDHT_C_PUBLIC void dht_runner_put_permanent(dht_runner* runner, const dht_infohash* hash, const dht_value* value, dht_done_cb done_cb, void* cb_user_data);
 OPENDHT_C_PUBLIC void dht_runner_cancel_put(dht_runner* runner, const dht_infohash* hash, dht_value_id value_id);
 OPENDHT_C_PUBLIC void dht_runner_shutdown(dht_runner* runner, dht_shutdown_cb done_cb, void* cb_user_data);
+OPENDHT_C_PUBLIC dht_infohash dht_runner_get_node_id(const dht_runner* runner);
+OPENDHT_C_PUBLIC dht_infohash dht_runner_get_id(const dht_runner* runner);
 
 #ifdef __cplusplus
 }