Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Protobuf对象作为贴图中的关键点_Java_Scala_Protocol Buffers_Grpc - Fatal编程技术网

Java Protobuf对象作为贴图中的关键点

Java Protobuf对象作为贴图中的关键点,java,scala,protocol-buffers,grpc,Java,Scala,Protocol Buffers,Grpc,我们可以使用protobuf类(从protobuf编译器生成的对象)作为HashMaps中的键吗 如何在protobuf类上实现hashCode()。hashcode()方法是否足够好,可以在大多数情况下避免冲突。是的,您可以使用协议缓冲区作为哈希键。协议缓冲区消息类型实现了消息,与内容相关的等于和hashCode实现 你可以,但你应该知道这样做有问题。在Proto2中,可选字段和扩展可能会产生一些令人惊讶的效果。例如,考虑下面的原语: message Foo { optional stri

我们可以使用protobuf类(从protobuf编译器生成的对象)作为HashMaps中的键吗


如何在protobuf类上实现hashCode()。hashcode()方法是否足够好,可以在大多数情况下避免冲突。

是的,您可以使用协议缓冲区作为哈希键。协议缓冲区消息类型实现了
消息
,与内容相关的
等于
hashCode
实现

你可以,但你应该知道这样做有问题。在Proto2中,可选字段和扩展可能会产生一些令人惊讶的效果。例如,考虑下面的原语:

message Foo {
  optional string bar = 1;
}

并考虑下面的代码:

Foo thing1 = Foo.newBuilder().setBar("").build();
Foo thing2 = Foo.getDefaultInstance();

Set<Foo> s = new HashSet<>();
s.add(thing1);
s.add(thing2);
这两个字段的所有字段都具有相同的值,但它们之间的比较不相等。
equals
hashCode
方法考虑是否设置了字段,即使默认值与设置值相同。这也是为什么有时您会看到单元测试报告两个proto不相等,而它们的字符串表示是相同的

另一个要考虑的是,原BUFF扩展对两个原型之间的平等有影响。如果使用扩展注册表解析同一个proto,而不使用扩展注册表,则这两种表示形式的比较将不相等。这可能令人惊讶,因为它们的编码导线格式相同,并且都被解析为相同的消息类型。在不使用扩展注册表解析proto的情况下,额外的数据将显示在未知字段中


如果你知道Protobuf是如何工作的,这一点是显而易见的,但对新手来说可能不是这样。

是什么阻止了你对它进行测试?我不熟悉这些“Protobuf类”,但你不能看看它们是否实现了
hashcode()
(以及
等于
)?谢谢你指向文档查看。但是,它似乎没有在那里实现。int hashCode()返回此消息的哈希代码值。消息的哈希代码应该将消息的类型(描述符的对象标识)与其内容(已知和未知字段值)混合在一起。子类必须实现这一点;继承Object.hashCode()不正确
assertEquals(thing1.getBar(), thing2.getBar()); // true