};
 
 typedef u32 (*rht_hashfn_t)(const void *data, u32 len, u32 seed);
-typedef u32 (*rht_obj_hashfn_t)(const void *data, u32 seed);
+typedef u32 (*rht_obj_hashfn_t)(const void *data, u32 len, u32 seed);
 typedef int (*rht_obj_cmpfn_t)(struct rhashtable_compare_arg *arg,
                               const void *obj);
 
        const char *ptr = rht_obj(ht, he);
 
        return likely(params.obj_hashfn) ?
-              rht_bucket_index(tbl, params.obj_hashfn(ptr, tbl->hash_rnd)) :
+              rht_bucket_index(tbl, params.obj_hashfn(ptr, params.key_len ?:
+                                                           ht->p.key_len,
+                                                      tbl->hash_rnd)) :
               rht_key_hashfn(ht, tbl, ptr + params.key_offset, params);
 }
 
 
  *     struct rhash_head       node;
  * };
  *
- * u32 my_hash_fn(const void *data, u32 seed)
+ * u32 my_hash_fn(const void *data, u32 len, u32 seed)
  * {
  *     struct test_obj *obj = data;
  *
 
        .exit = netlink_net_exit,
 };
 
-static inline u32 netlink_hash(const void *data, u32 seed)
+static inline u32 netlink_hash(const void *data, u32 len, u32 seed)
 {
        const struct netlink_sock *nlk = data;
        struct netlink_compare_arg arg;