「Go工具箱」一个将非负整数转换成唯一、无序ID的工具:hashids

d3b84f86f64770bc08067075c409a53f.png

今天给大家推荐的工具是hashids。该工具可以将一个正整数转换成长度较短、唯一且不连续的ID值。一般适用于生成用户ID,但又不想用有规律的ID的场景。

原理分析:将长字符串转换成短字符串的本质是进制转换。将小进制数往大进制数上转换就会变短,将大进制数往小进制数上转换就会变长。比如将一个二进制数转换成十进制就可以将二进制数变短。如下将1010转换成十进制就是 10,转换成十六进制就是a。该hashids包的原理也是一样,是基于62进制进行转换的。如下:

func hash(input int64) []rune{
  //a-z及A-Z及0-9共62个数
  var alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
  for {
    //通过取余法进行进制转换
    r := alphabet[input%int64(len(alphabet))]
    result = append(result, r)
    input /= int64(len(alphabet))
    if input == 0 {
      break
    }
  }
  return result
}

无序性是通过Fisher–Yates shuffle的算法将alphabet进行重排得到。该算法可以参考文末的参考链接,非常简单。

该包是对非负整数产生唯一ID的。个人认为是因为通过取余的方式进行进制转换的原理,那么负数和正数可能会产生同样的余数而导致非唯一性。

该包特点:

  • 对非负整数都可以生成唯一短id

  • 可以设置不同的盐,具有保密性

  • 递增的输入产生的输出无法预测

  • 代码较短,且不依赖于第三方库

基本使用

hd := hashids.NewData()
  hd.Salt = "my salt"
  h, _ := hashids.NewWithData(hd)
  id, _ := h.Encode([]int{1}) //只要这里的ID或salt值不一样,最终的id就不一样
  fmt.Println(id) // 最终输出 OL

设置生成最短ID的位数,如下设置最小长度是8位:

hd := hashids.NewData()
  hd.Salt = "my salt"
  hd.MinLength = 8
  h, _ := hashids.NewWithData(hd)
  id, _ := h.Encode([]int{1}) //只要这里的ID或salt值不一样,最终的id就不一样
  fmt.Println(id) // 最终输出 On5OLgYy

更多项目详情请查看如下链接:

开源项目地址:https://github.com/speps/go-hashids

开源项目作者:speps

参考链接:

Fisher–Yates shuffle算法:https://zhuanlan.zhihu.com/p/259652066

资料下载

点击下方卡片关注公众号,发送特定关键字获取对应精品资料!

  • 回复「电子书」,获取入门、进阶 Go 语言必看书籍。

  • 回复「视频」,获取价值 5000 大洋的视频资料,内含实战项目(不外传)!

  • 回复「路线」,获取最新版 Go 知识图谱及学习、成长路线图。

  • 回复「面试题」,获取四哥精编的 Go 语言面试题,含解析。

  • 回复「后台」,获取后台开发必看 10 本书籍。

对了,看完文章,记得点击下方的卡片。关注我哦~ 👇👇👇

如果您的朋友也在学习 Go 语言,相信这篇文章对 TA 有帮助,欢迎转发分享给 TA,非常感谢!c4c7baff1cc81e11503b2a1d0266d421.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值