【问题标题】:Encoding Java object to deterministic identifier将 Java 对象编码为确定性标识符
【发布时间】:2018-11-20 22:37:03
【问题描述】:

将 java 对象编码为可以解码为该对象的确定性标识符的最佳方法是什么?

基本上,我想在我们的响应中将此上游发送给客户,以便他们可以报告有关此标识符的指标。所以这个标识符必须是确定性的。我研究了 JSON 序列化 -> GZIP 压缩 -> base64 字符串。但是,我担心json对象中的字段不会总是保持相同的顺序,从而导致每次都有不同的字节集。有没有办法保留这个结构顺序?如果没有,有更好的方法吗?

另一个相关问题是是否有一种方法可以生成字符数最少的字符串,因为我们对生成的标识符有严格的空间要求。

【问题讨论】:

  • 当然。只需让数据库为您生成一个 ID,或使用 UUID,并将该 ID 和您的对象的状态存储在数据库中。当您需要从 ID 中取回对象时,请从数据库中获取它。看到这个页面的 URL 中的 53402638 了吗?这是您问题的ID。整个问题不存储在此 ID 中。它只是用来获取数据库中的问题。
  • 对不起,我应该说得更好。它不会用于数据库,认为这是我需要确定性的一个很好的例子。它用于 BI 团队在我们公司中使用的指标报告目的。所以持久性在我们这边并不是真正的最佳选择,特别是因为这个对象中的东西组合可能会导致我们不想维护的无限增长的表。
  • 这与在日志中维护序列化的完整对象有何不同? (除了通过丢弃所有早于某个日期的记录来清理数据库更容易)。
  • 您希望使用任何其他名称进行序列化。之后你对结果做什么:压缩、编码等是无关紧要的。您的关键问题是序列化以及它如何满足您的要求

标签: java json encoding base64 gzip


【解决方案1】:

我不知道将整个对象作为字节存储在数据库中是否是个好主意(我不确定它的好习惯)但如果你真的想要,我认为最直接的方法是将你的对象转换为字节数组,然后将字节数组转换为 base64 编码的字符串。

已经有一篇文章处理将对象转换为字节数组的问题(我很确定每次的字节顺序都是相同的): Java Serializable Object to Byte Array

还有一篇文章处理将字节数组转换为base64编码字符串的问题: How do I convert a byte array to Base64 in Java?

希望这会有所帮助..

编辑:

没有看到最后一部分,但通常你会使用像 Sha256 这样的哈希函数来获取某些数据的确定性标识符。

【讨论】:

    猜你喜欢
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多