Protobuf 映射的排序

Ordering of Protobuf maps

我正在 proto3 中创建消息对象并使用自动生成的 java 类。 我想为每个消息对象分配唯一键。

message Obj {
    ...
    string unique_key = 1;
    ...
}

在构建 Obj 期间,它从微服务接收一个名为 metaData 的原型对象,其定义如下:

message metData {
     map<string, string> keyFields = 1;
}

基于 metaData 对象中的条目,通过遍历映射并对每个条目进行散列来创建 unique_key。(keyFields 中最多有 10 个条目)

protobuf 文档says,无法定义键的顺序。我应该如何保证 keyFields 中具有相同条目的不同 metaData 对象生成相同的 unique_key

一般来说你有两个选择:

  1. 实现交换哈希函数。例如。获取键的哈希值并简单地对它们求和而忽略溢出。
  2. 获取密钥并对它们进行排序。然后对它们进行哈希排序。如果有“很多”键,考虑缓存哈希值。