0

0

tnfylink - ID 怎么样?

碧海醫心

碧海醫心

发布时间:2025-01-14 08:21:47

|

770人浏览过

|

来源于php中文网

原创

tnfylink - id 怎么样?

大家好!

欢迎阅读关于tnfy.link系列的第二篇文章——另一个URL缩短服务!本文将深入探讨短链接生成的策略。看似简单,但选择合适的链接生成方法却充满挑战。

短链接的核心是为每个长URL创建一个短小唯一的ID。这个ID需要满足以下条件:

  • 唯一性,避免冲突。
  • 足够短,便于实际使用。
  • 易于输入,减少错误。
  • 不可预测,防止猜测。

经过一番研究,我总结了四种主要的短链接生成方法。让我们逐一分析。


1. 随机字节法

最直接的方法是生成随机字节并进行编码。但需注意伪随机数和加密安全随机数的区别

伪随机数

Go语言的math/rand包提供伪随机数生成器(PRNG)。使用相同的种子(初始值),它会产生相同的数字序列。这对于很多应用足够了,但并不适合需要安全性和不可预测性的链接生成。

加密安全随机数

crypto/rand包更适合生成安全的随机数。它利用系统噪声生成真正随机且不可预测的值,例如利用物理层面的电磁噪声。这保证了高熵,但需注意虚拟机可能依赖主机获取随机数据,这可能会在高负载环境下降低生成速度。

随机字节编码

随机字节本身不适合作为URL,需要进行编码。常见的编码方法包括:

  1. 整数法:将字节转换为整数。易于输入,但ID可能较长。
  2. 十六进制法:用十六进制(0-9、A-F)编码字节。不区分大小写且不易输错。
  3. Base64法:使用字符A-Z、a-z、0-9、+、/和=编码字节。但它区分大小写且容易输错。
  4. Base58法:类似Base64,但排除了容易混淆的字符(如I、l、O、0)。更友好。比特币、Ripple和Flickr都使用了这种方法。

对于用户友好的短链接,Base58法通常是最佳选择,因为它兼顾了紧凑性和抗错性。

要点:

  • 随机字节保证唯一性和不可预测性。
  • Base58等编码方法提升了可用性。
  • 加密安全随机性确保可靠性。

2. 哈希法

哈希法根据输入(例如长URL)生成固定长度的值。它保证了一致性——相同的输入总是产生相同的输出——但缺乏随机性。这意味着多次缩短同一个URL会产生相同的ID,不满足不可预测性的要求。

在哈希之前添加随机盐可以引入变数,但这比直接使用随机字节更复杂且效率更低。

塔可商城
塔可商城

塔可商城, 一个基于springboot+uniapp+vue3技术栈开发的开源跨平台小程序、管理后台,后端服务的项目,它内置提供了会员分销, 区域代理, 商品零售等功能的新零售电商系统。强大弹性的架构设计,简洁的代码,最新的技术栈,全方面适合不同需求的前端,后端,架构的同学,同时更是企业开发需求的不二选择。 项目结构通过项目结构,你将清楚明白你即将入手的是一个怎么样的项目,你可能需要什么,如何

下载

3. UUID法

UUID(通用唯一标识符)广泛用于生成唯一值。但其默认格式对于短链接来说太长。可以通过重新编码UUID(例如,使用Base58)来缩短长度。

NanoID是UUID的替代方案,它使用可自定义的字母表生成更短的字符串(默认21个字符),可以优化ID的可读性和抗错性。

为什么不使用UUID?
UUID最终也是基于随机字节,所以相比直接生成随机值并没有显著优势。


4. 顺序法

随机值有时会导致重复,尤其是在高负载或ID较短的情况下。虽然tnfy.link并非为高负载场景设计,但仍需考虑潜在问题。

使用顺序计数器可以确保唯一性。Redis等工具可以使用INCR命令实现分布式计数器。但顺序ID是可预测的。将序列与随机字节结合可以解决这个问题,既保证唯一性又保证不可预测性。

例如:

  • 随机值 + 递增序列:如果两个实例生成相同的随机值,序列保证唯一性。

注意:ID中包含顺序组件可能会泄露生成的链接总数,这在某些情况下是不可取的。


结论

本文探讨了多种短链接生成方法:

  • 随机字节法:简单有效,尤其结合Base58等安全编码。
  • 哈希法:可靠,但缺乏随机性。
  • UUID/NanoID法:不错的替代方案,但比直接使用随机字节更复杂。
  • 顺序法:解决冲突,但会增加ID长度。

对于大多数用例,使用Base58编码的随机字节法就足够了。为了处理高负载场景下的冲突,可以将随机字节与顺序组件结合。虽然当前版本的tnfy.link后端尚未实现此功能,但我计划将来将其添加为可选功能。

感谢您的阅读!欢迎在评论区分享您对链接生成方法的看法和经验!


相关文章

如果您对我的项目感兴趣,请查看我关于Android短信网关的文章。

相关专题

更多
什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

325

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

232

2023.10.07

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

182

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

279

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

254

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

121

2025.08.07

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

258

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

208

2023.09.04

微信聊天记录删除恢复导出教程汇总
微信聊天记录删除恢复导出教程汇总

本专题整合了微信聊天记录相关教程大全,阅读专题下面的文章了解更多详细内容。

36

2026.01.18

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
进程与SOCKET
进程与SOCKET

共6课时 | 0.3万人学习

Redis+MySQL数据库面试教程
Redis+MySQL数据库面试教程

共72课时 | 6.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号