精选文章 Hashids.java使用入门

Hashids.java使用入门

作者:giserinchina 时间: 2020-08-05 08:30:32
giserinchina 2020-08-05 08:30:32

小型Java类,用于从一个或多个数字生成类似YouTube的哈希值。

Ivan Akimov从javascript hashids.js移植

它是什么?

hashids(哈希ID)从无符号(长)整数创建短的,唯一的,可解码的哈希。

它是为网站设计的,用于URL缩短,跟踪内容或将页面设为私有(或至少不可猜测)。

该算法尝试满足以下要求:

  1. 哈希值必须唯一且可解码。
  2. 它们应该能够包含多个整数(因此您可以在复杂或集群系统中使用它们)。
  3. 您应该能够指定最小哈希长度。
  4. 散列不应该包含基本的英语诅咒词(因为它们旨在出现在公共场所-如URL)。

而不是显示的项目12或者3,你可以告诉他们的U6dcu87UHMou。您不必将这些散列存储在数据库中,但是可以即时进行编码和解码。

所有(长)整数都必须大于或等于零。

用法

添加依赖项

哈希值在Maven Central中可用。如果您使用的是Maven,请将以下依赖项添加到pom.xml的依赖项中:


  org.hashids
  hashids
  1.0.3

另外,如果您使用gradle或在android上,请build.gradle在依赖项下将以下内容添加到应用程序的文件中:

compile 'org.hashids:hashids:1.0.3'

导入包裹

导入 org.hashids ;

编码一个数字

您可以传递唯一的盐值,因此您的哈希值不同于其他所有人的哈希值。我以“这是我的盐”为例。

Hashids hashids =  new  Hashids这是我的盐);
字符串 hash = hashids 编码(12345L);

hash 现在将是:

NkK9

解码

注意,在解码期间,使用相同的盐值:

Hashids hashids =  new  Hashids这是我的盐);
long []数字=哈希值解码( NkK9 );

numbers 现在将是:

[ 12345 ]

用不同的盐解码

如果更改盐,解码将不起作用:

Hashids hashids =  new  Hashids这是我的胡椒粉);
long []数字=哈希值解码( NkK9 );

numbers 现在将是:

[]

编码多个数字

Hashids hashids =  new  Hashids这是我的盐);
字符串 hash = hashids 编码(683L94108L123L5L);

hash 现在将是:

aBMswoO2UB3Sj

解码方式相同

Hashids hashids =  new  Hashids这是我的盐);
long []数字=哈希值解码( aBMswoO2UB3Sj );

numbers 现在将是:

[ 683, 94108, 123, 5 ]

编码并指定最小哈希长度

在这里,我们对整数1进行编码,并将最小哈希长度设置为8(默认值为0,这意味着哈希将是最短的长度)。

Hashids hashids =   Hashids这是我的盐8);
字符串 hash = hashids 编码(1L);

hash 现在将是:

gB0NV05e

解码

Hashids hashids =   Hashids这是我的盐8);
long []数字=哈希值解码( gB0NV05e );

numbers 现在将是:

[ 1 ]

指定自定义哈希字母

在这里,我们将字母设置为仅包含六个字母:“ 0123456789abcdef”

Hashids hashids =  new  Hashids这是我的盐0 0123456789abcdef );
字符串 hash = hashids 编码(1234567L);

hash 现在将是:

b332db5

编码和解码“ MongoDB” ID

除了对长值进行编码和解码外,Hashids还提供用于以十六进制表示法对ID(例如由MongoDB生成的对象ID)进行编码和解码的功能。

Hashids hashids =  new  Hashids这是我的盐);
字符串 hash = hashids encodeHex( 507f1f77bcf86cd799439011 ); // goMYDnAezwurPKWKKxL2 
字符串 objectId = hashids encodeHex(hash); // 507f1f77bcf86cd799439011

注意,用于对十六进制值进行编码和解码的算法与用于对长值进行编码和解码的算法不兼容。这意味着您不能使用decodeHex提取使用编码的长id的十六进制表示形式encode

随机性

哈希值的主要目的是混淆ID。它不是为了安全目的或压缩目的而使用或经过测试的。话虽如此,该算法确实试图使这些哈希值变得不可猜测和不可预测:

重复号码

Hashids hashids =  new  Hashids这是我的盐);
字符串 hash = hashids 编码(5L5L5L5L);

您看不到任何重复的模式,这些模式可能显示哈希中有4个相同的数字:

1Wc8cwcE

与递增数字相同:

Hashids hashids =  new  Hashids这是我的盐);
字符串 hash = hashids 编码(1L2L3L4L5L6L7L8L9L10L);

hash 将会 :

kRHnurhptKcjIDTWC3sx

递增数字散列:

Hashids hashids =  new  Hashids这是我的盐);
字符串 hash1 = hashids 编码(1L); / * NV * /
字符串 hash2 =哈希值编码(2L); / * 6m * /
字符串 hash3 = hashids 编码(3L); / * yD * /
字符串 hash4 =哈希值编码(4L); / * 2l * /
字符串 hash5 =哈希值编码(5L); / * rD * /

坏哈希

我编写此类的目的是将这些哈希放置在可见的位置,例如URL。如果我为每个用户创建一个唯一的哈希,那么不幸的是,如果哈希最终成为一个坏词,那将是不幸的。想象一下,自动为您的用户创建一个带有哈希的网址,如下所示-http://example.com/user/a**hole

因此,该算法尝试避免使用默认字母生成最常见的英语诅咒词。这是通过切勿将以下字母彼此相邻来完成的:

c, C, s, S, f, F, h, H, u, U, i, I, t, T

局限性

原始和参考实现是JSHashids网站)版本。JS的number限制为(2^53 - 1)。我们的java实现使用Long,但出于兼容性考虑,限于JS的相同限制。如果提供的数字更大,IllegalArgumentException将抛出。

勿删,copyright占位
分享文章到微博
分享文章到朋友圈

上一篇:当C++多态遇到默认参数

下一篇:美团点评移动网络优化实践

您可能感兴趣

  • .NET Core:通过Web API进行微服务交互

    目录 介绍 命名协议 MicroCommerce应用程序结构 MicroCommerce应用开发 1.接口项目,微服务接口和模型类 2. ProductCatalog项目 3. ShoppingCart项目 4. ActivityLogger项目 5. WebUI项目,用户界面 6.关于通用功能的几句话 应用测试 结论 缺点 下载源代码26.3 KB 介绍 几乎所有在.NET Core中使用...

  • HTML5和WAP的联系与区别!

      随着时代的快速发展,移动互联网加速来临,有越来越多的热门技术被人们提及和应用。虽然人们对于HTML5大前端、大数据、云计算、等热门IT技术热情不减,但对于技术与技术之间的区别以及具体生活的应用了解的还不是十分详细。今天,就让我们以HTML5大前端为例,具体讲解一下移动互联网时代下HTML5大前端和WAP之间的区别与联系。   首先,从定义上区分。HTML5的全称是“超文本标记语言”,它是...

  • cocos2d 之lua加密

    加密方式 lua 代码加密方式很很多种,这里只讲最简单的一种,就是把代码编译成二进制字节码。lua 是一门脚本语言,不需要经过编译就可以使用 lua 解释器来执行;但我们也可以把 lua 代码事先编译成二进制文件,这样就达到了加密的方式。 使用 lua 编译器 最简单也最直接的方式就是使用 lua 编译器来编译 lua 代码,编译的方式很简单,打开命令行,输入下面的命令 lucac -o o...

  • JetPack WorkManager

    1.概览 官方文档:WorkManager 谷歌实验室:官方教程 官方案例:android-workmanager WorkManger介绍视频:中文官方介绍视频 谷歌工程师博客:https://medium.com/androiddevelopers/workmanager-basics-beba51e94048 Android JetPack实例学习:https://www.jiansh...

  • hualinux 进阶 1.24:k8s调度器的优先级与抢占机制 (整理)

    目录 一、优先级和抢占机制说明 二、优级先和抢占机制设计和实现 k8s调度器的优先级与抢占机制,这个比较重要,需要了解。 优先级和抢占机制,解决的是 Pod 调度失败时该怎么办的问题。 一、优先级和抢占机制说明 优先级和抢占机制,解决的是 Pod 调度失败时该怎么办的问题。 正常情况下,当一个 Pod 调度失败后,它就会被暂时“搁置”起来,直到 Pod 被更新,或者集群状态发生变化,调度器才...

  • 尽量简单与简单的相对性

    简单的定义 什么叫复杂,没有做了没有必要的逻辑,达到目的有更简单的路线,比如下图: 尽量通过简单的办法来达到目的,技术本身并无优劣之分,关键是要识别面对当前场景的问题,分析出当中的痛点,选用合适的技术解决;比如上图中如果A和B之间直线有陷阱,有可能看似绕远的路径依然是最简单的路径。 应用一:简化需求 功能设计复杂了,不一定有收益,可能更不好用; 举个例子: 需求:平时我会在电脑上把不同的资料...

  • CRM管理策略为什么能增加企业利润?

    CRM(客户关系管理)是一种管理策略,它的核心在于企业用来管理它们与现有客户和潜在客户之间互动的所有活动、策略与技术,让你的客户在不同阶段的客户生命周期都有最佳体验。在很多企业内,我们都能听到“顾客至上”这句话,如果制定有效的CRM管理策略,带给客户良好的体验,可以帮助企业实现利润的增长。 为什么CRM管理策略能增加企业利润? 无论在哪个行业,客户忠诚度都是非常重要,CRM帮助企业与客户建立...

  • 深度学习到底有哪些经典成果?道翰天琼认知智能机器人API平台接口为您揭秘。

    深度学习到底有哪些经典成果?道翰天琼认知智能机器人API平台接口为您揭秘。 2006年,Hinton 发表了一篇论文《A Fast Learning Algorithm for Deep Belief Nets》,提出了降维和逐层预训练方法,该方法可成功运用于训练多层神经网络,使深度网络的实用化成为可能。该论文也被视作深度学习领域的经典之作。 从原理来看,深度学习与神经网络紧密相关:神经网络...

华为云40多款云服务产品0元试用活动

免费套餐,马上领取!
CSDN

CSDN

中国开发者社区CSDN (Chinese Software Developer Network) 创立于1999年,致力为中国开发者提供知识传播、在线学习、职业发展等全生命周期服务。