ProtoMemberAttribute 上的 AsReference 如何工作
How does AsReference on the ProtoMemberAttribute work
我有一个分布式客户端-服务器应用程序(多个服务器)。用户可以将数据从一台服务器发送到另一台服务器。这仅允许(客户定义的)结构(又名 DataType
)在所有服务器上都是相同的。
因此我使用 protobuf-net 序列化了 DataType
并比较了二进制数据的 MD5 散列。
但这里有一个问题:二进制数据不同(因此 MD5 哈希)但所有属性(用 ProtoMemberAttribute
修饰)具有完全相同的值!
我有几个字段已定义 [ProtoMember(5, AsReference = true)]
- 我怀疑内部识别标签的生成不是确定性的。
有谁知道那一代的详细工作原理吗?
一般来说,依赖二进制 protobuf 相等是不是个好主意?
我们正在使用 VS2010。净 4.0。一个 protobuf-net 2.0.0.668.
我不知道它不确定的原因,但我也不会在每种情况下都绝对保证它。
Is it in general a bad idea to rely on binary protobuf equality?
是的,是的。格式本身有很多东西,相同的数据可以不同的方式呈现:
- 字段可以按任何顺序排列;图书馆应该按升序排列,但不需要到
- 合并(连接)数据可以,作为上述示例,意味着语义相同的数据可以有多种形式,因为(只要字段不冲突)"chunk A, chunk B" 在语义上应该是与 "chunk B, chunk A"
相同
- 该格式没有明确禁止 varint 编码的次正规形式;我的意思是
5
的 正常和预期 表示是 0x05
,但是 0x8500
、0x858000
、0x85808000
(等)是 也 5
的所有完全合法的 varint 表示
- 如果您使用动态类型(仅限 protobuf-net,不是核心 protobuf 功能),则类型的汇编版本将成为输出的一部分;这可以改变
我有一个分布式客户端-服务器应用程序(多个服务器)。用户可以将数据从一台服务器发送到另一台服务器。这仅允许(客户定义的)结构(又名 DataType
)在所有服务器上都是相同的。
因此我使用 protobuf-net 序列化了 DataType
并比较了二进制数据的 MD5 散列。
但这里有一个问题:二进制数据不同(因此 MD5 哈希)但所有属性(用 ProtoMemberAttribute
修饰)具有完全相同的值!
我有几个字段已定义 [ProtoMember(5, AsReference = true)]
- 我怀疑内部识别标签的生成不是确定性的。
有谁知道那一代的详细工作原理吗?
一般来说,依赖二进制 protobuf 相等是不是个好主意?
我们正在使用 VS2010。净 4.0。一个 protobuf-net 2.0.0.668.
我不知道它不确定的原因,但我也不会在每种情况下都绝对保证它。
Is it in general a bad idea to rely on binary protobuf equality?
是的,是的。格式本身有很多东西,相同的数据可以不同的方式呈现:
- 字段可以按任何顺序排列;图书馆应该按升序排列,但不需要到
- 合并(连接)数据可以,作为上述示例,意味着语义相同的数据可以有多种形式,因为(只要字段不冲突)"chunk A, chunk B" 在语义上应该是与 "chunk B, chunk A" 相同
- 该格式没有明确禁止 varint 编码的次正规形式;我的意思是
5
的 正常和预期 表示是0x05
,但是0x8500
、0x858000
、0x85808000
(等)是 也5
的所有完全合法的 varint 表示
- 如果您使用动态类型(仅限 protobuf-net,不是核心 protobuf 功能),则类型的汇编版本将成为输出的一部分;这可以改变