长链接转短链接

开坑


此文基于Naccl大佬的项目学习得出,本文只梳理思路,不深究技术细节

预览地址:https://d.naccl.top/

GitHub:https://github.com/Naccl/ShortURL

大致逻辑:

因为此应用场景不需要加密,所以选取MurmurHash.
MurmurHash 是一种非加密型哈希函数,适用于一般的哈希检索操作。相较于加密hash,这个性能更高,碰撞更小.支持32 bit、64 bit、128 bit 的实现,32 bit 已经足够表示近 43 亿个短链接。使用 Java 的话,在 Google 的 guava 或 hutool 中有相应实现,此项目使用 hutool.

hutool的导入依赖:

点击查看代码
         <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.6.1</version>
        </dependency>







此函数为32bit的hash,使用得出的hash值,与预先设置的char数组结合,chars[hashcode%chars.lenth] ,hashcode/=chars.lenth;将字符拼接起来,得出最后的字符串就是生成好的短连接.




此时
hash算法肯定会碰撞,由于短链接越来越多,碰撞概率越来越大.

使用布隆过滤器,查询是否添加过这个连接,如果添加过,判断redis中是否有缓存
1.有,直接返回短链接,并重置缓存时间;
2,没有,则在短链接后面添加自定义字符,重新hash,与此往复循环,直到布隆过滤器中没有添加此短链接,存入数据库.(数据库设置字段唯一属性)

此项目还设计了关于生成短链接速率的限制,不在这里做讨论

posted @ 2022-01-31 00:40  蜗牛卷  阅读(876)  评论(0)    收藏  举报