使用 MySQL 实现 Java 版的 hashCode 函数

前提

MySQL 数据库的编码需要设置为 utf8utf8mb4,因为下面给出的代码是以用 utf8 编码储存数据为前提的。

MySQL Function

drop function if exists utf8_unicode;
create function utf8_unicode(str varchar(1)) returns bigint
begindeclare num_utf8 bigint default ord(str);declare bit8 int default num_utf8 & 0xff;declare num_unicode bigint default 0;declare byte_count int default 0;while bit8 >> 6 = 2 doset num_unicode = num_unicode | ((bit8 & 0x3f) << (byte_count * 6));set byte_count = byte_count + 1;# 超出 utf8 编码范围if byte_count >= 6 thenreturn null;end if;set num_utf8 = num_utf8 >> 8;set bit8 = num_utf8 & 0xff;end while;if byte_count = 0 and bit8 & 0x80 = 0 thenreturn num_utf8;elseif bit8 >> (6 - byte_count) = (1 << (byte_count + 2)) - 2 thenset num_unicode = num_unicode | ((bit8 & ((1 << (6 - byte_count)) - 1)) << (byte_count * 6));return num_unicode;end if;return null;
end;drop function if exists java_hash;
create function java_hash(str varchar(128)) returns bigint
begindeclare _pos int default 1;declare _hash bigint default 0;declare _size int default char_length(str);while _pos <= _size doset _hash = _hash * 31 + utf8_unicode(substring(str, _pos, 1));set _pos = _pos + 1;end while;return _hash;
end;

说明

总共就两个函数,一个用于将 utf8 编码转为 unicode;一个使用 unicode 计算 Java 版的 hash 值。

最后附上查找以 hash 模式分表的数据的存储过程。例如 shop_book 表,按 hash 分成 16 个表,实际的表名则是:shop_book_0, shop_book_1, shop_book_2, ... , shop_book_15

createdefiner = sa@`%` procedure find_sharding_tables(IN t_name varchar(100), IN t_where varchar(1000))
proc: begin# 1. 找出分表中有 book_id = '62f0c54172eba41decbab9f5' 这条数据的表序号#     call find_sharding_tables('shop_book', 'book_id="62f0c54172eba41decbab9f5"');#     RESULT: 8,# 2. 找出分表中储存了数据的表序号#     call find_sharding_tables('shop_book', null);#     RESULT: 0,8,15,declare res varchar(255) default '';declare i int default 0;declare sd_t_name varchar(100);declare sd_t_where varchar(1000) default '';if t_name is null or length(trim(t_name)) < 1 thenleave proc;elseif t_name regexp '^[.\\w]+_\\d*$' thenset t_name = left(t_name, length(t_name) - locate('_', reverse(t_name)));end if;if t_where is not null and length(trim(t_where)) > 0 thenset sd_t_where = concat(' where ', if(locate('''', t_where) > 0, t_where, replace(t_where, '"', '''')));end if;lp: loopset sd_t_name = concat(t_name, '_', i);select count(1) into @existed from information_schema.TABLES where (TABLE_SCHEMA = database() and TABLE_NAME = sd_t_name) or concat(TABLE_SCHEMA, '.', TABLE_NAME) = sd_t_name;if @existed <= 0 thenleave lp;end if;set @sql = concat('select count(1) into @found from ', sd_t_name, sd_t_where);prepare stmt from @sql;execute stmt;deallocate prepare stmt;if @found > 0 thenset res = concat(res, i, ',');end if;set i = i + 1;end loop;select if(length(trim(res)) < 1, if(i != 0, 'NOT FOUND', 'NO SUCH TABLE'), res) as RESULT;
end;

使用方式:

# 1. 找出分表中有 book_id = '62f0c54172eba41decbab9f5' 这条数据的表序号
call find_sharding_tables('shop_book', 'book_id="62f0c54172eba41decbab9f5"');# 2. 找出分表中储存了数据的表序号
call find_sharding_tables('shop_book', null);# 3. 支持双单引号
call find_sharding_tables('shop_book', 'book_id=''62f0c54172eba41decbab9f5''');# 4. 支持多条件
call find_sharding_tables('shop_book', 'book_id="62f0c54172eba41decbab9f5" and (deleted is null or deleted = 0)');# 5. 支持忽略表序号
call find_sharding_tables('shop_book_3', 'book_id="62f0c54172eba41decbab9f5"');# 6. 支持指定库名
call find_sharding_tables('test_db_2.shop_book', 'book_id="62f0c54172eba41decbab9f5"');

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

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

相关文章

【GB28181】SIP协议实践之Windows下VS2019编译eXosip、osip,测试(附工程源码,一键打开编译)

引言 SIP开源库或者GB28181,这里选择了osip和eXosip,但是这两个库的编译使用有些麻烦,源码下来之后编译会出现很多问题,网上也没有找到完整的编译介绍,只能一步一步的找办法解决,以下帮大家整理编译过程。 如果不想编译,可以跳转文章末尾链接直接下载相应工程直接编译即…

登录校验认证

会话技术 会话&#xff1a;用户打开浏览器&#xff0c;访问web服务器的资源&#xff0c;会话建立&#xff0c;直到有一方断开连接&#xff0c;会话结束。在一次会话中可以包含多次请求和响应。 会话跟踪&#xff1a; 一种维护浏览器状态的方法&#xff0c;服务器需要识别多次请…

Aop注解+Redis解决SpringBoot接口幂等性(源码自取)

目录 一、什么是幂等性&#xff1f; 二、哪些请求天生就是幂等的&#xff1f; 三、为什么需要幂等 1.超时重试 2.异步回调 3.消息队列 四、实现幂等的关键因素 关键因素1 关键因素2 五、引入幂等性后对系统的影响 六、Restful API 接口的幂等性 实战Aop注解redis解…

计算机网络——计算机网络的性能

计算机网络——计算机网络的性能 速率带宽吞吐量时延时延宽带积往返时间RTT利用率信道利用率网络利用率 我们今天来看看计算机网络的性能。 速率 速率这个很简单&#xff0c;就是数据的传送速率&#xff0c;也称为数据率&#xff0c;或者比特率&#xff0c;单位为bit/s&#…

神经网络 梯度与神经元参数w、b关系;梯度与导数关系

参考&#xff1a;https://blog.csdn.net/weixin_44259490/article/details/90295146 视频&#xff1a;https://www.bilibili.com/video/BV1a14y167vh 概念 梯度与w的关系可以用梯度下降公式来表示&#xff1a;ww−α ∂ c o s t ∂ w \frac{\partial cost}{\partial w} ∂w∂…

vs创建asp.net core webapi发布到ISS服务器

打开服务器创建test123文件夹&#xff0c;并设置共享。 ISS配置信息&#xff1a; 邮件网站&#xff0c;添加网站 webapi asp.net core发布到ISS服务器网页无法打开解决方法 点击ISS Express测试&#xff0c;可以成功打开网页。 点击生成&#xff0c;发布到服务器 找到服务器IP…

idm对比aria2哪个好 aria2和idm哪个快 Aria2和IDM的原理

一、idm对比aria2哪个好 下面对aria2和idm进行对比&#xff0c;看看哪款更好。 idm: 优势&#xff1a; 1&#xff09;可将下载速度提升5倍以上&#xff1b; 2&#xff09;界面友好&#xff0c;操作简便&#xff1b; 3&#xff09;支持多个主流的浏览器&#xff1b; 4&am…

基于Vue的娱讯移动端APP前端设计与实现

目 录 摘 要 Abstract 引 言 1绪论 1.1课题背景及目的 1.1.1移动端APP发展简介 3 1.1.2移动端APP的优势 3 1.2前端开发相关技术 1.2.1前端开发工具介绍 3 1.2.2 前端开发相关技术介绍 4 1.3本章小结 2系统分析 2.1功能需求分析 2.2系统工作流程 2.3本章小结 3系统设…

自研cloud框架专题–通用cache模块(五)

通用cache模块 项目特点1.保留原框架的集成&#xff0c;扩展&#xff0c;配置能力2.对于spring-cache增强1.引入核心依赖2.开启多cache配置2.自选缓存pom依赖 二:使用示例1.api示例2.注解示例三:配置说明1.REDISSON_LOCAL_MAP2.REDISSON_2PC 开源地址:https://github.com/28928…

【论文阅读】Segment Anything论文梳理

Abstract 我们介绍了Segment Anything&#xff08;SA&#xff09;项目&#xff1a;新的图像分割任务、模型和数据集。高效的数据循环采集&#xff0c;使我们建立了迄今为止最大的分割数据集&#xff0c;在1100万张图像中&#xff0c;共超过10亿个掩码。 该模型被设计和训练为可…

一例APC注入型病毒分析

概述 这个病毒通过可移动存储介质传播&#xff0c;使用了应用层APC注入和dga域名技术&#xff0c;整个执行过程分为4个阶段&#xff0c;首先从资源节中解密出一段shellcode和一个PE&#xff0c;执行shellcode&#xff0c;创建一个同名的傀儡进程&#xff0c;将解密出来的PE注入…

多轨迹建模方法的介绍与实操-基于R语言

本文介绍了多轨迹建模方法&#xff08;Group-Based Multivariate Trajectory Modeling&#xff09;&#xff0c;这是一种扩展了单指标组基轨迹建模的技术&#xff0c;用于分析多个疾病生物标志物或临床重要因素的联合轨迹&#xff0c;以更好地理解和追踪疾病进程、行为或健康状…

2024蓝桥杯每日一题(归并排序)

一、第一题&#xff1a;火柴排队 解题思路&#xff1a;归并排序 重点在于想清楚是对哪个数组进行归并排序求逆序对 【Python程序代码】 from math import * n int(input()) a list(map(int,input().split())) b list(map(int,input().split())) na,nb [],[] for …

c++结构体中定义函数方法介绍

在C中&#xff0c;结构体&#xff08;Struct&#xff09;是一种用户自定义的数据类型&#xff0c;用于组织不同数据类型的成员。结构体可以包含变量、常量、函数等&#xff0c;使得数据的组织更加灵活。以下是关于C结构体中函数的介绍&#xff1a; 结构体声明&#xff1a; 在介…

【OpenGL手册12】 统一变量Uniform

OpenGL基础 - 统一变量Uniform 目录 一、说明二、 Uniform变量概念2.1 Uniform变量和特点2.2 Uniform变量定义方法2.3 Uniform变量赋值和传参 三、如何在Shader中自定义Location四、赋值五、统一变量缓冲对象六、赋值函数 一、说明 关于统一变量&#xff0c;也有一系列概念和方…

【嵌入式】字体极限瘦身术:Fontmin在嵌入式UI中的魔法应用(附3500常用汉字)

1. 概述 在嵌入式系统的用户界面&#xff08;UI&#xff09;设计中&#xff0c;字体的选择和优化至关重要。一个恰当的字体不仅能够提升用户体验&#xff0c;还能彰显产品特色。然而&#xff0c;由于嵌入式设备常常受限于存储空间和处理能力&#xff0c;大型字体文件可能成为性…

代码随想录算法训练营第五十五天丨583. 两个字符串的删除操作、72. 编辑距离

583. 两个字符串的删除操作 开窍了 class Solution:def minDistance(self, word1: str, word2: str) -> int:n1, n2 len(word1), len(word2)dp [[0] * (n2 1) for _ in range(n1 1)]for i in range(1, n1 1):dp[i][0] ifor j in range(1, n2 1):dp[0][j] jfor i i…

LeetCode的使用方法

LeetCode的使用方法 一、LeetCode是什么&#xff1f;1.LeetCode简介2.LeetCode官网 二、LeetCode的使用方法1.注册账号2.力扣社区力扣编辑器 2.1 讨论发起讨论参与讨论关注讨论 2.2 文章撰写文章关注文章 3.力扣面试官版测评面试招聘竞赛 4.力扣学习LeetBook 书架我的阅读猜您喜…

支付宝开放平台证书验签生成签名接入方式的操作流程之公钥证书,密钥证书的生成

#小李子9479# 调用支付宝接口的安全验证方式均使用sign_type为RSA2的方式&#xff0c;有两种 1。密钥模式&#xff1a;应用公钥、应用私钥、平台公钥生成签名和验签方式 2。证书模式&#xff1a;支付宝根证书、支付宝公钥证书、应用公钥证书、应用私钥&#xff0c;采用RSA20…

【2024.3.8练习】[2015 国 AC] 穿越雷区

题目描述 题目分析 最短步数问题&#xff0c;采用BFS算法即可。 我的代码 #include <iostream> #include <algorithm> #include <queue> #include <cmath> using namespace std; int n; int ans; int flag; const int max_n 102; char map[max_n][m…