java - Java:将大字符串转换为较小的固定长度字符串的简单方法
问题描述
我正在解决一个需要比较 JSON 对象的内容的问题。我必须对许多记录重复执行此操作。我无法进行 Apple 与 Apple 比较,因为我必须跳过几个字段进行比较,而且 Arrays 中的数据可能有不同的顺序。
对于 Ex,以下 JSON 被认为具有相同的内容,即使它们具有
- 不同的“id”值。
- “兴趣”数组中的不同值序列。
json1:
{
"id":1,
"name":"John",
"dept":"HR",
"interests":["Reading","Cycling"]
}
json2:
{
"id":5,
"name":"John",
"dept":"HR",
"interests":["Cycling","Reading"]
}
我们的计划是创建一个表并将比较逻辑移植到数据库查询。这些数据稍后将用于执行其他一些操作。
- 编号(10)
- 名称VARCHAR(256)
- 部门VARCHAR(256)
- 兴趣VARCHAR(256)
映射到数据库列(id、name、dept)的字段适合直接查询。兴趣值可以增长并且它们是动态的,我想编写一个方法来使用“兴趣”数组中的值生成一个唯一的字符串,这样我就不必将整个字符串存储到表中。
我将调用该方法来生成字符串,填充为兴趣列的值并插入到表中,同时查询时,我将使用相同的方法来填充我的查询参数。
注意:我的 JSON 有几个更复杂的对象,为了简化,我采用了简单的 JSON。
解决方案
您想以某种方式将长字符串存储在较短的(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
同样,这会导致信息丢失:
- 哈希冲突,因为输出空间(大小取决于算法)小于输入空间(实际上是无限的)
- 散列是一种单向操作
但是,如果您可以忍受误报的风险,这可能是可行的。正如@HansKesting 在评论中提到的,确保在散列(顺序、大小写)之前对数组值进行规范化。此策略的重要属性是散列长度是固定的。
压缩字符串
例如,放气:
The quick brown fox jumps over the lazy dog <-> eJwLyUhVKCzNTM5WSCrKL89TSMuvUMgqzS0oVsgvSy1SKAFK5yRWVSqk5KcDAFvcD9o=
The quick brown fox jumps over the fence <-> eJwLyUhVKCzNTM5WSCrKL89TSMuvUMgqzS0oVsgvSy1SKAFKp6XmJacCAC1yDsE=
压缩字符串使您有机会将字符串解压缩回其原始形式。缺点是输出长度是可变的且未知的——并且某些类型的输入比其他类型更适合压缩。
总之,从您的问题和评论中阅读,只有“正确”的关系方式似乎是正确的,但散列可能被证明是可行的。
推荐阅读
- vue.js - 在使用 CDN 中的 Vuejs 并运行 Codekit 时,如何将组件拆分为更小的文件?
- python - 如何使用 sqlalchemy add_all 在 Fast API 中批量保存
- node.js - React 应用程序成功部署到heroku,但状态未更新
- microsoft-teams - 具有 Azure 身份验证的自定义 Teams 应用在 Teams 桌面应用中不起作用
- bash - editing the name of a variable in bash
- wpf - WPF View 不隐藏主窗口内容
- javascript - 如果数组为空,则在 React 中进行条件渲染
- powershell - 根据 ComboBox1 选择填充 ComboBox2
- python - 如何在运行时从远程机器上的另一个脚本更改变量的值?
- arduino - 带有 ESP8266 的 EspSoftwareSerial:错误没有匹配函数调用“SoftwareSerial::SoftwareSerial()”