首页 > 解决方案 > Java:将大字符串转换为较小的固定长度字符串的简单方法

问题描述

我正在解决一个需要比较 JSON 对象的内容的问题。我必须对许多记录重复执行此操作。我无法进行 Apple 与 Apple 比较,因为我必须跳过几个字段进行比较,而且 Arrays 中的数据可能有不同的顺序。

对于 Ex,以下 JSON 被认为具有相同的内容,即使它们具有

json1:

{
"id":1,
"name":"John",
"dept":"HR",
"interests":["Reading","Cycling"]
}

json2:

{
"id":5,
"name":"John",
"dept":"HR",
"interests":["Cycling","Reading"]
}

我们的计划是创建一个表并将比较逻辑移植到数据库查询。这些数据稍后将用于执行其他一些操作。

映射到数据库列(id、name、dept)的字段适合直接查询。兴趣值可以增长并且它们是动态的,我想编写一个方法来使用“兴趣”数组中的值生成一个唯一的字符串,这样我就不必将整个字符串存储到表中。

我将调用该方法来生成字符串,填充为兴趣列的值并插入到表中,同时查询时,我将使用相同的方法来填充我的查询参数。

注意:我的 JSON 有几个更复杂的对象,为了简化,我采用了简单的 JSON。

标签: javastringoracle

解决方案


您想以某种方式将长字符串存储在较短的(er)空间中。该策略取决于您的需求。有几点需要考虑:

  • 您是否需要对该字段进行索引(以便SELECT基于此执行?)
  • 您是否需要比较字符串是否相等?如果是这样,误报是否可以接受?
  • …</li>

您有几种选择,各有利弊。

正确的一对多关系引用

如前所述,执行此操作的正确方法是规范化引用。因此,一个(id, interest)元组表和另一个带有(data-id, interest-id)引用的表将确保没有信息丢失

截断字符串

例如,18 个字符:

The quick brown fox jumps over the lazy dog -> The quick brown fo
The quick brown fox jumps over the fence    -> The quick brown fo

只要结果长度比输入字符串短,截断就会导致信息丢失。这可能是也可能不是问题。根据输入字符串的截断可以从输入的任一端(或者,实际上,任何地方)完成。

散列字符串

例如,md5

The quick brown fox jumps over the lazy dog -> 9e107d9d372bb6826bd81d3542a419d6
The quick brown fox jumps over the fence    -> 26d68913b492ebb7fe734b973a358ab8

同样,这会导致信息丢失:

  1. 哈希冲突,因为输出空间(大小取决于算法)小于输入空间(实际上是无限的)
  2. 散列是一种单向操作

但是,如果您可以忍受误报的风险,这可能是可行的。正如@HansKesting 在评论中提到的,确保在散列(顺序、大小写)之前对数组值进行规范化。此策略的重要属性是散列长度是固定的。

压缩字符串

例如,放气

The quick brown fox jumps over the lazy dog <-> eJwLyUhVKCzNTM5WSCrKL89TSMuvUMgqzS0oVsgvSy1SKAFK5yRWVSqk5KcDAFvcD9o=
The quick brown fox jumps over the fence    <-> eJwLyUhVKCzNTM5WSCrKL89TSMuvUMgqzS0oVsgvSy1SKAFKp6XmJacCAC1yDsE=

压缩字符串使您有机会将字符串解压缩回其原始形式。缺点是输出长度是可变的且未知的——并且某些类型的输入比其他类型更适合压缩。


总之,从您的问题和评论中阅读,只有“正确”的关系方式似乎是正确的,但散列可能被证明是可行的。


推荐阅读