You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 14:25:17