资讯专栏INFORMATION COLUMN

hashids插件库解决序列id易泄露易推导的问题

lentrue / 2195人阅读

摘要:自增序列类型数字主键,完全的自动增长,容易被判断推导出其他的主键值。本方案就是使用解决易推导的问题,并且在数据量不大的情况下也不大。这些是彼此独立生成的,碰撞风险非常小,可以忽略不计。是可以根据盐值反向解码的。增量输入被破坏以保持不可思议。

ID管理方式的介绍

32位UUID转Base64编码,快速的id生成方案,问题在于编码可读性差,长度太长,查询效率低。

自增序列类型数字主键,完全的自动增长,容易被判断推导出其他的主键值。本方案就是使用hashids解决id易推导的问题,并且id在数据量不大的情况下也不大。

根据时间戳生成ID。如果你能承受一定程度的碰撞,你可以编写一个动态建立的id。使用计数器(如果有的话)+时间戳(以毫秒为单位)+某个系统值(IP地址或某个机器ID)+随机整数。许多大公司都采用这种方法,因为它在分布式系统中运行良好。这些ID是彼此独立生成的,碰撞风险非常小,可以忽略不计。一般可能需要依赖redis等服务。

Hashids是一个小型开源库,可以从数字中生成简短,独特,非顺序的ID。

它将像347这样的数字转换为像“yr8”这样的字符串,或者像[27,986]这样的数字数组转换为“3kTMd”。这在将多个参数捆绑到一个或简单地将它们用作短UID时非常有用。
注意Hashids不是真正的加密算法,Hashids的工作方式与整数转换为十六进制的方式类似,但有一些例外:
1.字母表不是base16,而是默认的base base62。
2.字母表也根据盐进行洗牌。
 Hashids一种混淆数字的算法,与普通意义的hash(类似md5等的单向散列算法)不是一个意思。Hashids是可以根据盐值反向解码的。因为盐值的存在,可以一定程度的防止破解。
特征
1.从数字(正数和零)创建短唯一ID。
2.允许自定义字母和盐 - 所以ID只有你自己。
3.增量输入被破坏以保持不可思议。
4.代码很小(约350行),速度快,不依赖于外部库。

代码示例

Hashid库可以支持各种语言,例如javascript或者java。以下以java为例。

import org.hashids.Hashids;
public class HashIds {
    public static void main(String[] args) {
        Hashids hashids = new Hashids("this is my salt");
        long a=12345678L;
        System.err.println("1待转码的数字:"+a);
        String hash = hashids.encode(a);
        System.err.println("1转码结果:"+hash);
        hashids = new Hashids("this is my salt");//用加密的盐解密
        long[] numbers = hashids.decode(hash);
        System.err.println("1解码结果:"+numbers[0]);//其可以加密数组,默认相当于数组
        
        
        long b1=100L;
        long b2=200L;
        Hashids hashids2 = new Hashids("this is my salt", 8);//8代表最低转码位数,防止位数太少
        System.out.println("2待转码的数字组合:"+b1+","+b2);
        String hash2 = hashids2.encode(b1,b2);
        System.out.println("2转码结果:"+hash2);
         hashids2= new Hashids("this is my salt", 8);
        long[] numbers2 = hashids2.decode(hash2);
        System.out.println("2解码结果:"+numbers2[0]+","+numbers2[1]);
    }
}

如果是maven程序,可以在pom这样引入


   org.hashids
   hashids
   1.0.3


文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/77851.html

相关文章

  • Android 2019最新面试实战总结

    摘要:内存泄漏当应用内部不再需要某个实例后,但是这个对象却仍然被引用,这个情况就叫做内存泄露。安卓虚拟机为每一个应用分配一定的内存空间,当内存泄露到达一定的程度就会造成内存溢出。点击登录跳转页面中所有操作都与用户密切相关,是 Android: 今日头条屏幕适配的原理? 1:首先计算出 density,计算公式:当前设备屏幕总宽度(单位为像素)/ 设计图总宽度(单位为 dp) = densit...

    Caicloud 评论0 收藏0
  • 夯实基础系列一:Java 基础总结

    摘要:可实现单例模式代码块初始化静态变量,只被执行一次内部类不能与外部类重名,只能访问外部类静态数据包括私有多分支选择整型或字符类型变量或整数表达式开始支持。 前言 大学期间接触 Java 的时间也不短了,不论学习还是实习,都让我发觉基础的重要性。互联网发展太快了,各种框架各种技术更新迭代的速度非常快,可能你刚好掌握了一门技术的应用,它却已经走在淘汰的边缘了。 而学习新技术总要付出一定的时间...

    greatwhole 评论0 收藏0
  • Python中可迭代对象、迭代器和生成器

    摘要:本文重点掌握可迭代的对象的定义掌握可迭代对象迭代器与生成器之间的关系和异同熟悉标准库中生成器。二迭代器迭代器介绍迭代器用于从集合中取出元素的对象。若想再次迭代须重建迭代器。迭代器检查方式调用,。区别可迭代的对象不是迭代器。 导语:本文章记录了本人在学习Python基础之控制流程篇的重点知识及个人心得,打算入门Python的朋友们可以来一起学习并交流。 本文重点: 1、掌握可迭代的对象的...

    starsfun 评论0 收藏0
  • 编写高效且优雅 Python 代码(1)

    摘要:查看原函数的参数注释甚至函数名的时候,只能看到装饰器的相关信息。也就是说,它是装饰器的装饰器,并且以原函数为参数,作用是保留原函数的各种信息,使得我们之后查看被装饰了的原函数的信息时,可以保持跟原函数一模一样。 貌似只能创建一个专栏,所以这篇文章只好放到JavaScript从前端到全终端里了? 原文链接:Effective Python Python 作为一门入门极易并容易上瘾的语...

    roadtogeek 评论0 收藏0

发表评论

0条评论

lentrue

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<