如何在OpenDHT C++实现中自定义ValueType以控制数据存储?
OpenDHT自定义ValueType的实现与使用指南
在OpenDHT的C++实现中,自定义ValueType是规范DHT存储数据的校验、过期、修改规则的核心机制。你给出的示例已经是一个标准的自定义ValueType模板,下面拆解说明各部分作用及后续使用方法:
一、自定义ValueType的核心组成
你定义的FRIEND_REQUEST_TYPE包含5个关键参数,每个参数的作用如下:
- 类型ID:
0x1001,全局唯一的数值标识,用于区分不同自定义数据类型,需避开内置类型ID范围(内置类型通常为0x0001至0x0FFF) - 类型名称:
"FriendRequest",用于日志和调试的可读性标识 - 过期时间:
std::chrono::hours(24 * 7),数据在DHT中的自动过期时长,这里设置为7天 - 存储校验策略:Lambda函数,决定数据是否允许被节点存储
你的逻辑要求:数据必须签名,且数据所有者的证书ID必须与存储的InfoHash匹配,确保只有目标用户对应的节点能验证并存储该请求 - 修改校验策略:Lambda函数,决定新数据是否能覆盖旧数据
你的逻辑限制:仅原请求者(旧数据所有者)可修改,且新数据的序列号seq必须大于旧数据,保证修改操作的递增性,避免冲突
二、使用自定义ValueType存储数据
定义好ValueType后,需用它创建Value实例,再通过DHT节点完成存储:
// 假设已初始化dht::Node实例node // 序列化好友请求数据(可选用protobuf、msgpack等方式序列化自定义结构体) std::vector<uint8_t> friend_request_data = serialize_friend_request(your_request_struct); // 创建自定义类型的Value实例,设置所有者证书与初始序列号 dht::Sp<dht::Value> friend_request_val = dht::Value::create(FRIEND_REQUEST_TYPE, friend_request_data); friend_request_val->owner = your_user_certificate; // 提前生成/加载的用户证书 friend_request_val->seq = 1; // 初始版本序列号 // 以目标用户的InfoHash为key,将数据存入DHT dht::InfoHash target_user_hash = dht::InfoHash::get("target_user_unique_id"); node.put(target_user_hash, friend_request_val);
三、获取自定义类型的数据
要检索DHT中属于FriendRequest类型的数据,需在get请求中指定类型过滤:
// 检索目标用户下的所有好友请求 node.get(target_user_hash, [](const dht::Sp<dht::Value>& val) { if (val->type == FRIEND_REQUEST_TYPE) { // 反序列化二进制数据为自定义请求结构体 auto friend_request = deserialize_friend_request(val->data); // 执行好友请求处理逻辑 process_friend_request(friend_request, val->owner); } return true; // 返回true以继续接收其他匹配结果 }, dht::Value::Filter{FRIEND_REQUEST_TYPE});
四、关键注意事项
- 签名与证书:你的存储策略要求数据必须签名,因此创建
Value时必须设置owner证书,OpenDHT会自动完成签名验证 - 类型ID唯一性:自定义类型ID建议从
0x1000开始使用,避免与内置类型冲突 - 序列化选择:OpenDHT仅负责存储二进制数据,需自行选择合适的序列化方案,确保数据能正确序列化和反序列化
内容的提问来源于stack exchange,提问作者Gabriel Snow
相关产品推荐
相关产品推荐

