短链码生成:MurmurHash 与 62 进制转换
Guava 的 MurmurHash 测试与封装简介Guava 自带 MurmurHash 算法直接调用生成 32 位哈希值再封装到工具类背景短链码用 MurmurHash 生成Guava、Jedis 等框架已经集成了这个算法不用从头开发会用即可面试一般不会让你手写 MurmurHash单元测试随机拼接 URL生成 32 位哈希值TestpublicvoidtestMurmurHash(){for(inti0;i50;i){intnum1random.nextInt(1000000);intnum2random.nextInt(1000000);intnum3random.nextInt(1000000);StringoriginalUrlnum1xdclassnum2.netnum3;longmurmur3_32Hashing.murmur3_32().hashUnencodedChars(originalUrl).padToLong();System.out.println(murmur3_32murmur3_32);}}关键 APIAPI说明Hashing.murmur3_32()Guava 的 32 位 MurmurHash 函数com.google.common.hash.HashinghashUnencodedChars(url)对字符串计算哈希返回HashCodepadToLong()把HashCode转成 long测试结果输出类似3638367641、2660229547的 long 值30 多亿32 位哈希值最多 40 多亿个数据量大了冲突率就高可以扩大位数封装到公共模块的CommonUtil/***murmur hash算法*paramparam*return*/publicstaticlongmurmurHash32(Stringparam){longmurmurHash32Hashing.murmur3_32().hashUnencodedChars(param).padToLong();returnmurmurHash32;}为什么要封装成工具类以后可能换成其他哈希算法只需改工具类调用方不用动解耦避免牵一发而动全身短链生成组件 ShortLinkComponent简介组件传入原始 URL先算 MurmurHash再把哈希值转成 62 进制得到短链码整体流程传入原始 URL返回短链码组件加Component交给 Spring 扫描long 型哈希值不直接当短链码转成更短的字符串节省空间图中红色节点是本节新增的进制转换绿色是最终得到的短链码组件代码ComponentpublicclassShortLinkComponent{/***62个字符*/privatestaticfinalStringCHARS0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ;/***生成短链码*paramparam*return*/publicStringcreateShortLinkCode(Stringparam){longmurmurhashCommonUtil.murmurHash32(param);// 进制转换StringcodeencodeToBase62(murmurhash);returncode;}/***10进制转62进制*paramnum*return*/privateStringencodeToBase62(longnum){// StringBuffer线程安全StringBuilder线程不安全StringBuffersbnewStringBuffer();do{inti(int)(num%62);sb.append(CHARS.charAt(i));numnum/62;}while(num0);Stringvaluesb.reverse().toString();returnvalue;}}10 进制转 62 进制除 62 取余余数对应CHARS里的字符图中橙色节点容易漏余数是从低位往高位追加的最后要反转注意点CHARS是 62 个字符0~9 共 10 个 小写 a~z 大写 A~ZStringBuffer线程安全内部加锁StringBuilder线程不安全面试常问这里sb是方法内的局部变量方法栈每个线程独享用StringBuilder也是线程安全的ShortLinkComponent 测试与疑惑解答简介随机 URL 测试短链码生成并解释为什么用 62 进制、短链码是不是固定 6 位测试前的准备测试类加RunWith(SpringRunner.class)、SpringBootTest(classes LinkApplication.class)注入ShortLinkComponent短链服务还没有启动类复制账号服务的启动类改名LinkApplication启动类要放在根包下放到其他目录会有问题注解照搬MapperScan、EnableTransactionManagement、EnableFeignClients、EnableDiscoveryClient、SpringBootApplication第一次运行报错Data sources cannot be empty原因短链服务依赖公共模块公共模块带了 sharding-jdbc启动时会检查数据源配置解决先把账号服务的 shardingsphere 数据源配置复制过来库表还没建只是让项目能启动层级不要放错刚搭微服务时引入 MyBatis 相关依赖就报错也多是因为没配 jdbc 连接单元测试/***测试短链平台*/TestpublicvoidtestCreateShortLink(){for(inti0;i100;i){intnum1random.nextInt(10);intnum2random.nextInt(1000000);intnum3random.nextInt(1000000);StringoriginalUrlnum1xdclassnum2.netnum3;StringshortLinkCodeshortLinkComponent.createShortLinkCode(originalUrl);log.info(originalUrl:originalUrl, shortLinkCodeshortLinkCode);}}测试结果示例原始 URL短链码5xdclass2349606.net68491654gOpNV2xdclass3182358.net708873413YUz0xdclass3940745.net5761123gWIeY9xdclass361362.net6243601yciwC原始链接再长生成的短链码也都在 5~6 位之间为什么用 62 进制不用 64 进制维度62 进制64 进制字符数字 小写字母 大写字母还有/、这样的符号放进 URL可以不符合正常 URL 的字符10 进制转 62 进制可以缩短字符6 位字符就有 560 亿个组合已经满足业务需求短链码是不是固定 6 位不是看业务情况有些短链还会加入其它特殊字符例京东短信里的短链形如3.cn/10-xxxxxx有数字前缀和横杠共 9 位左右横杠位置也不固定阿里云、淘宝的短链也不是固定位数按项目数据量定后续做分库分表改造短链码里要加入库表的基因组件注释里的返回值写的是“db 编码 6 位短链编码”不必拘泥位数和字符集满足业务需求就行量更大就加长到 7、8 位或加入更多字符面试/考试记忆点短链码 原始 URL 先做 MurmurHash再把哈希值转成 62 进制Guava 自带 MurmurHashHashing.murmur3_32().hashUnencodedChars(url).padToLong()32 位哈希值最多 40 多亿个数据量大了冲突率高可以扩大位数哈希算法封装进工具类以后换算法只改一处10 进制转 62 进制除 62 取余查字符表循环到 0 后反转用 62 进制不用 64 进制是因为 64 进制有/、不适合放进 URL为什么转 62 进制缩短字符6 位就有 560 亿个组合量更大就用 7、8 位短链码不一定是固定 6 位分库分表后还要加入库表基因

相关新闻

绿深LD3320离线语音识别方案:从资料包到可运行工程

绿深LD3320离线语音识别方案:从资料包到可运行工程

简介:绿深LD3320语音识别模块全套开发资料,面向单片机开发者、嵌入式初学者及需要为项目加入语音交互功能的工程师。资源围绕LD3320芯片的语音识别与串口通信能力展开,帮助读者摆脱物理按键依赖,快速实现语音指令控制。压缩包共18…

2026/10/15 20:57:12 阅读更多 →
微信小程序实战案例:计时器,理解 JS 定时器与 CSS 视觉叠加

微信小程序实战案例:计时器,理解 JS 定时器与 CSS 视觉叠加

微信小程序实战案例:计时器,理解 JS 定时器与 CSS 视觉叠加摘要:本篇基于案例 3.5 计时器,讲解小程序中一次性定时器、循环定时器的实际开发,结合页面状态控制、事件绑定、CSS 伪元素扩展效果,梳理开发思路…

2026/10/14 18:47:02 阅读更多 →
全国县级行政边界shp使用指南:坐标系、空间连接与区域统计

全国县级行政边界shp使用指南:坐标系、空间连接与区域统计

简介:这份全国省、县界线shp格式矢量图面向地理信息系统从业者、地图可视化开发者及需要行政区划底图的学生与研究人员,解决全国范围内精确到县级的行政边界数据获取问题,可用于专题制图、空间分析、区域统计与GIS教学等场景。资源以rar压缩包…

2026/10/14 18:47:02 阅读更多 →

最新新闻

算法导论英文原版第三版PDF:从伪代码到红黑树实现与复杂度分析

算法导论英文原版第三版PDF:从伪代码到红黑树实现与复杂度分析

简介:《算法导论》英文原版教材(第三版)PDF,面向计算机专业学生、算法学习者与求职备考人群,用于系统建立算法设计与分析的知识体系。全书共34章,从算法在计算中的角色讲起,依次覆盖插入排序、分…

2026/10/15 20:56:57 阅读更多 →
Win7 64位下USB转串口驱动安装指南:CH340/CP210x/FTDI/PL2303排错全收录

Win7 64位下USB转串口驱动安装指南:CH340/CP210x/FTDI/PL2303排错全收录

简介:这是一份专为 Windows 7 64 位系统准备的 USB 转串口驱动资源,适用于需要通过 USB 接口连接老式串行设备(如工业控制、GPS、调制解调器等)的用户,解决现代电脑缺少物理串口导致设备无法识别的问题。压缩包共含 25…

2026/10/15 20:56:57 阅读更多 →
光伏功率预测系统用户手册V1.0.1实战指南:数据链路、模型调优与考核避坑

光伏功率预测系统用户手册V1.0.1实战指南:数据链路、模型调优与考核避坑

简介:这份《国能日新光伏功率预测系统用户使用手册V1.0.1》面向光伏电站运维人员、电力调度从业者及新能源相关专业学习者,系统讲解北京国能日新光伏电场功率预报管理系统的操作与配置方法。手册围绕人机界面、接口与数据库三部分展开,涵盖用…

2026/10/15 20:56:57 阅读更多 →
Erupt 对接 Elasticsearch 数据源全解析:注解驱动索引绑定、查询下推与完整 CRUD 实现

Erupt 对接 Elasticsearch 数据源全解析:注解驱动索引绑定、查询下推与完整 CRUD 实现

后端低代码AI 应用人工智能AI Agent认证鉴权RAG 【免费下载链接】erupt 🚀 通用数据管理框架,VORM 对象视图模型,注解驱动低代码开发 项目地址: https://gitcode.com/erupts/erupt 点击查看 免费下载 erupt-data-es 是 Erupt 通用…

2026/10/15 20:56:57 阅读更多 →
从零构建VST 3插件:CMake工程、参数管理与避坑实战

从零构建VST 3插件:CMake工程、参数管理与避坑实战

简介:这是一份VST 3插件开发SDK资源包,面向音频插件开发者、音乐软件工程师及具备一定C基础的学习者,帮助其在Windows、macOS、Linux和iOS平台上构建音效、乐器和音频处理工具。SDK遵循VST 3模块化架构,插件与宿主经由音频处理器、…

2026/10/15 20:56:57 阅读更多 →
NDIS小端口驱动开发实战:从Miniport注册到NBL收发路径详解

NDIS小端口驱动开发实战:从Miniport注册到NBL收发路径详解

简介:这是一份面向Windows内核网络驱动开发者的NDIS 6.0小端口驱动实例源码,针对Realtek 8111/8168/8169/8110等PCI千兆以太网控制器编写。由于DDK中可参考的miniport示例仅有E100BEX,学习NDIS 6.0网卡驱动的资料相当稀缺,本资源正…

2026/10/15 20:55:56 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →