工作纪实56-ES搜索串一致性

最近接收到了一个需求,一个用户有一组搜索串,比如字符串:abcdefg,如果新增的数据是abdcdfge,则视为是同一条数据,可以理解为即使顺序不同,但是实际上也是唯一串;
为什么是一个数据串我解释一下:大部分的公司es搜索功能(中台),都是会做二次开发的,到实际业务部门,需要根据他们二次开发的规则,提供一个查询数据串

思路

  • 对即将生成的唯一串数据,要先处理成有序字段【treeMap】
  • 生成的唯一串结果最好是定长(不定长的字符串->定长的字符串:hash算法)
  • 运算效率(暂时不考虑,一般都很快)

有点数字签名的意思,只不过这个地方不需要公司秘钥

代码

我选择的是sha-256哈希加密,安全性还可以,生成的效率够用

如果不考虑安全性的话,md5效率要更好一点;

public static String genUniqueKey(String uid, String queryCond) {String[] paramsArray = queryCond.split("&");Map<String, String> paramsMap = new TreeMap<>();for (String param : paramsArray) {String[] keyValue = param.split("=");paramsMap.put(keyValue[0], keyValue[1]);}// 将参数按照键名排序StringBuilder sortedParams = new StringBuilder(uid).append("&");for (Map.Entry<String, String> entry : paramsMap.entrySet()) {sortedParams.append(entry.getKey()).append("=").append(entry.getValue()).append("&");}// 使用SHA-256生成哈希值try {java.security.MessageDigest md = java.security.MessageDigest.getInstance("SHA-256");byte[] hash = md.digest(sortedParams.toString().getBytes("UTF-8"));StringBuilder hexString = new StringBuilder();for (byte b : hash) {String hex = Integer.toHexString(0xff & b);if (hex.length() == 1) hexString.append('0');hexString.append(hex);}return hexString.toString();} catch (Exception e) {e.printStackTrace();}return null;
}

思考

sha-256生成的串太长了,想短点?
这个算法输出的结果是64(32 * 2)个字符,一个字符2个字节(sha-256生成的结果是32位的)
策略1: 截断处理
直接截断或者自定义抽取不同位置的字符,形成新的串,数据量不大的情况下,理论上唯一性也可以保证

策略2:套娃算法

  1. 考虑过压缩算法(一般在网络传输的时候传输、接收用,不符合场景)
  2. 使用其他的定长算法二次加密【没找到】
  3. 自定义算法,一定范围内的定长【转载自:https://developer.aliyun.com/article/816907,见仁见智吧,如果每个字符串都不一样,长度直接翻倍了】
    第一种,只统计字符出现次数,比如aabcccccaaa,压缩成a5b1c5
public static String doDepressTwo(String str) {if ("".equals(str)) return str;char[] chars = str.toCharArray();HashMap<Character, Integer> map = new HashMap<>();for (char c : chars) {if (map.containsKey(c)) {//如果存在该键,则只需要value+1Integer integer = map.get(c);map.put(c, ++integer);} else {//如果不存在该键,就直接放入,value为1map.put(c, 1);}}StringBuilder sb = new StringBuilder();map.entrySet().forEach(entry -> {//将key和value拼接到sbsb.append(entry.getKey()).append(entry.getValue());});return sb.toString();
}

第二种,统计相邻字符串出现次数,比如aabcccccaaa,压缩成a2b1c5a3
思路:需要维护一个当前对比字符,一个字符出现次数,用第n个字符去和第n+1个字符对比,相等则出现次数+1,不相等则拼接在字符串后面

public static String doDepress(String str) {//字符串为空直接返回if ("".equals(str)) return str;StringBuilder buffer = new StringBuilder();//用第n个字符去和第n+1个字符对比char c = str.charAt(0);//记录字符出现次数,默认为1int repeat = 1;for (int i = 1; i < str.length(); i++) {if (c == str.charAt(i)) {//如果第n个字符和第n+1个字符相等,则出现次数+1repeat++;} else {//如果第n个字符和第n+1个字符不相等,则拼接在字符串后面buffer.append(c).append(repeat);//拼接完后重置当前字符串c = str.charAt(i);//重置字符出现次数repeat = 1;}}//最后一组在for循环里是没有拼接的return buffer.append(c).append(repeat).toString();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/52541.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

没及格,我猜这套华为软件测试面试题没几个人能及格

一&#xff0e;填空 1、 系统测试使用&#xff08; C &#xff09;技术, 主要测试被测应用的高级互操作性需求, 而无需考虑被测试应用的内部结构。 A、 单元测试 B、 集成测试 C、 黑盒测试 D、白盒测试 2、单元测试主要的测试技术不包括&#xff08;B &…

layui栅格布局设置列间距不起作用

layui栅格布局支持设置列间距&#xff0c;只需使用预置类layui-col-space*即可。不过实际使用时却始终看不到效果。   根据layui官网文档的说明&#xff0c;只需要在行所在div元素的class属性中增加layui-col-space*即可出现列间距。如下图所示&#xff1a;   但是实际使用…

【数据结构】二叉树的顺序结构,详细介绍堆以及堆的实现,堆排序

目录 1. 二叉树的顺序结构 2. 堆的概念及结构 3. 堆的实现 3.1 堆的结构 3.2 堆的初始化 3.3 堆的插入 3.4 堆的删除 3.5 获取堆顶数据 3.6 堆的判空 3.7 堆的数据个数 3.8 堆的销毁 4. 堆的应用 4.1 堆排序 4.1.1 向下调整建堆的时间复杂度 4.1.2 向上调整建…

GPT-4o System Card is released

GPT-4o System Card is released, including red teaming, frontier risk evaluations, and other key practices for industrial-strength Large Language Models. https://openai.com/index/gpt-4o-system-card/ 报告链接 企业级生成式人工智能LLM大模型技术、算法及案例实战…

MSSQLILABS靶场通关攻略

判断注入 首先用单双引号判断是否存在注入&#xff0c;这里可以看到是单引号 判断是否为 MSSQL 数据库 可以通过以下Payload来探测当前站点是否是MSSQL数据库&#xff0c;正常执行说明后台数据库为MSSQL&#xff1b;也可以根据页面的报错信息来判断数据库 and exists( select…

validateFields里的values是空值

总结-反思 前提&#xff1a;react-后台管理&#xff0c;父组件里套着子组件&#xff0c;如后台管理的待办、待阅页面 情况&#xff1a;后台管理表格页面&#xff0c;输入内容点击查询&#xff0c;查到对应数据后&#xff0c;点击这条数据&#xff0c;当把点开的数据关闭时&…

基于pygame的雷电战机小游戏

import pygame import sys import random# 初始化 Pygame pygame.init()# 设置窗口尺寸 WIDTH, HEIGHT 800, 600 screen pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("雷电战机")# 设置颜色 BLACK (0, 0, 0) RED (255, 0, 0) GREEN (…

对于现货白银走势图分析,不是单纯为了回报

投资白银选对工具和产品真的很重要。如果投资者选择的是实物银条&#xff0c;或者纸白银等相对低效的投资方式&#xff0c;收益只能跟随白银的价格涨跌&#xff0c;比如今年以来&#xff0c;国际白银价格上涨了大概30%&#xff0c;投资者的收益就顶多只有30%&#xff0c;万一买…

人工智能有哪些应用?

在科技的浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;犹如一颗璀璨的明星&#xff0c;以其独特的魅力和无限潜力吸引了全球的目光。随着深度学习、机器学习、自然语言处理等核心技术的飞速发展与迭代&#xff0c;人工智能已经从实验室走向各行各业&#xff0c;深深地…

[数据集][目标检测]道路积水检测数据集VOC+YOLO格式2699张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2699 标注数量(xml文件个数)&#xff1a;2699 标注数量(txt文件个数)&#xff1a;2699 标注…

redis实战——go-redis的使用与redis基础数据类型的使用场景(一)

一.go-redis的安装与快速开始 这里操作redis数据库&#xff0c;我们选用go-redis这一第三方库来操作&#xff0c;首先是三方库的下载&#xff0c;我们可以执行下面这个命令&#xff1a; go get github.com/redis/go-redis/v9最后我们尝试一下连接本机的redis数据库&#xff0…

「C#」EF Core的“迁移”(Migration)

1、“迁移”是什么 “迁移”&#xff08;Migration&#xff09;我觉得可以理解为将实体类的变化 转换为对数据库修改的方案&#xff0c;应用迁移就是将这个修改方案应用到数据库。其次&#xff0c;迁移也记录了数据库的版本历史等信息。 2、添加迁移 2.1、dotnet cli tool …

如何在Java Maven项目中使用JUnit 5进行测试

如何在Java Maven项目中使用JUnit 5进行测试 1. 简介 JUnit 5概述 JUnit是Java编程语言中最流行的测试框架之一。JUnit 5是JUnit的最新版本&#xff0c;它引入了许多新特性和改进&#xff0c;使得编写和运行测试更加灵活和强大。 为什么选择JUnit 5 JUnit 5不仅提供了更强…

Furion+SqlSugar+Swagger企业级后端工程师 - 学习路线总目录

一、Furion框架介绍 Furion 是一个基于 .NET 5 平台开发的框架&#xff08;Furion v5 版本采用 C# 12 和 .NET 8 进行开发。&#xff09;&#xff0c;致力于使 .NET 开发过程更简单、通用和流行。该框架的名字“Furion”源自中文“先知”&#xff0c;意味着它旨在领先和预见技…

设计模式反模式:UML图示常见误用案例分析

第一章 引言 1.1 设计模式与反模式概述 在软件开发领域&#xff0c;设计模式与反模式是两种截然不同的概念&#xff0c;它们在软件设计过程中起着至关重要的作用。设计模式是经过验证的最佳实践&#xff0c;用于解决在特定上下文中经常出现的问题&#xff0c;从而提高软件的可…

《黑神话·悟空》是用什么编程语言开发的?

最近火爆全球的国产 3A 大作《黑神话悟空》&#xff0c;你玩了吗&#xff1f;没玩没关系&#xff0c;有人就是对游戏不感冒&#xff0c;我找了个宣发片&#xff0c;一起感受下3A大作的视觉冲击&#xff0c;而且还是我们从小听到大&#xff0c;那猴子&#x1f412;的故事。 ‌‌…

【Python进阶】面向对象编程:用Python实现类与对象

1、面向对象编程概论 1.1 面向对象编程起源与发展 面向对象编程&#xff08;Object-Oriented Programming, OOP&#xff09;并非一夜之间凭空诞生的概念&#xff0c;它的历史可以追溯到20世纪60年代末期&#xff0c;当时Simula 67被认为是首个支持面向对象编程的编程语言。这…

【Linux】自动化构建工具makefile

目录 背景 makefile简单编写 .PHONY makefile中常用选项 makefile的自动推导 背景 会不会写makefile&#xff0c;从一个侧面说明了一个人是否具备完成大型工程的能力 ​ ◉ 一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…

Scrapy 项目部署Scrapyd

什么是Scrapyd Scrapyd 是一个用来管理和运行 Scrapy 爬虫的服务。它允许用户将 Scrapy 项目部署到服务器上&#xff0c;然后通过一个简单的 API 来启动、停止和监控爬虫的运行。Scrapyd 可以帮助简化爬虫的部署过程&#xff0c;使得用户不必手动在服务器上运行爬虫&#xff0c…

【测试】JMeter从入门到进阶

本文参考 Jmeter自动化测试工具从入门到进阶6小时搞定&#xff0c;适合手工测试同学学习_哔哩哔哩_bilibili JMeter介绍 JMeter 是 Apache 组织使用 Java 开发的一款测试工具&#xff1a; 1、可以用于对服务器、网络或对象模拟巨大的负载 2、通过创建带有断言的脚本来验证程序…