C# 通过在小数据集中散列压缩guid

C# 通过在小数据集中散列压缩guid,c#,hash,guid,compression,C#,Hash,Guid,Compression,我正在开发一个移动应用程序,我想优化它从服务器接收的数据(作为JSON)。 返回3个列表(每个列表包含自己的对象类,大约列表大小为50、100和170)。每个对象都有一个Guid id,每个对象都有一些关系数据。例如: o = { Id = "8f088552-5b24-4ba4-a6e5-8958c4353581", RelatedIds = ["19d2e562-0874-473f-8e05-7052e8defd9a", "615b4c47-199a-4f7d-8268-08ed

我正在开发一个移动应用程序,我想优化它从服务器接收的数据(作为JSON)。 返回3个列表(每个列表包含自己的对象类,大约列表大小为50、100和170)。每个对象都有一个Guid id,每个对象都有一些关系数据。例如:

o = { Id = "8f088552-5b24-4ba4-a6e5-8958c4353581",
      RelatedIds = ["19d2e562-0874-473f-8e05-7052e8defd9a", "615b4c47-199a-4f7d-8268-08ed43d9c891", ... ] }

有没有一种方法可以在不存储身份图的情况下将这些guid压缩到某个分类程序中?也许可以使用哈希函数?

您可以将GUID的16字节表示形式转换为基64字符串。但是,您没有提到编程语言,因此我们无法进一步提供帮助


此处不建议使用散列函数,因为散列函数通常是有损的。

否。(非加密)散列的一个属性是它们发生冲突:
hash(A)==hash(b)
A!=b
。它们是一种性能优化,在这种情况下,您需要进行大量的相等性检查,并期望得到许多错误的结果(因为如果
hash(a)!=hash(b)
那么
a!=b
)。GUID->计数器映射可能是获取较小ID的最佳方式。

您可以将十六进制(base16)转换为base64,并删除所有标点符号。使用base64可以节省25%,标点符号可以节省4个字节。

再想一想,我意识到HTTP压缩(如果启用)可能会很好地压缩数据,因此手动压缩数据并不值得。

加密哈希也会发生冲突。理论上。常规散列在实践中总是会发生冲突。“否”是关于压缩guid的最初目标的错误答案。即使下面的Base64答案也证明了这是可能的(…并且可以改进)。