Objective C 的 Hashids 实现
从无符号整数生成短哈希(如 YouTube 和 Bitly)。
Hashids 专为 URL 缩短、跟踪东西、验证账户或使页面私有而设计。与其显示为 1
、2
或 3
,您可以显示为 b9iLXiAa
、EATedTBy
和 Aaco9cy5
。哈希取决于您的盐值。
通过 Cocoapods
将名为 Hashids
的 Cocoapod 添加到 Podfile
中
pod "Hashids"
保存 Podfile 后,运行以下命令
pod install
通过下载
您可以通过从 http://www.github.com/jofell/Hashids 存储库下载文件来为 Objective-C 安装 Hashids。您可以执行以下任一操作
通过运行以下命令克隆存储库
git clone https://github.com/jofell/Hashids.git
在从存储库中获取文件后,转到文件夹 Hashids/Pod/Classes
并将所有类文件添加到您的 XCode 项目中。
一旦将类文件添加到您的 XCode 项目中,只需将 Hashids 导入到 Objective-C 源代码中。
#import <Hashids/Hashids.h>
然后创建一个 Hashids
类的实例。
Hashids *hashid = [Hashids new];
要加密单个整数
NSString *hash = [hashids encrypt:@123, nil]; // @"AjL"
请注意,与其他 hashids 实现(例如)不同,您应使用 NSNumber
实例作为加密参数。另外请注意,参数是 nil
结束的,这意味着 encrypt:
调用可以接受任意数量的参数,如下所示
NSString *hash = [hashids encrypt:@123, @456, @789, nil]; // @"qa9t96h7G"
要解密 NSString 哈希
NSArray *ints = [hashids decrypt:@"qa9t96h7G"]; // @[ @123, @456, @789 ]
请注意,这个调用只返回一个 NSArray 实例。这是为了使此方法的返回值更一致。
Hashids 支持通过接受一个盐值、最小哈希长度和自定义字母表来个性化您的哈希值。以下是自定义哈希值的方法
Hashids *hasher = [[Hashids alloc] initWithSalt:@"this is my salt"
minLength:8
andAlpha:myAlpha];
通常,您可以通过提供上述三个参数中的任何一个来自定义散列。盐值和字母表默认为 nil
,而散列长度默认最小为0,即在通过 new
或 init
分配 Hashids
实例时。以下示例仅使用这三个参数来自定义。
Hashids *hasher = [Hashids hashidWithSalt:@"this is my salt 1"];
[hasher encrypt:@123, nil]; // @"rnR"
当盐值变化时,生成的散列也会变化。
Hashids *hasher = [Hashids hashidWithSalt:@"this is my salt 2"];
[hasher encrypt:@123, nil]; // @"XBn"
长度在6到32个字符之间的盐值可以提供良好的随机性。
默认情况下,散列将是最短的。您可能希望增加散列长度的一个原因是要掩盖散列背后整数的真实大小。
这可以通过将最小散列长度传递给 init
调用来实现。散列将通过添加额外字符来填充,使其看似更长。
Hashids *hasher = [Hashids hashidWithSalt:@"this is my salt"
andMinLength:16];
[hasher encrypt:@1, nil]; // @"AA6Fb9iLXiAaBFB5"
可以为散列设置自定义字母表。默认字母表为 @"xcS4F6h89aUbideAI7tkynuopqrXCgTE5GBKHLMjfRsz"
。
要使散列中仅包含小写字母,请传递以下自定义字母表:
Hashids *hasher = [Hashids hashidWithSalt:@"this is my salt"
minLength:16
andAlpha:@"abcdefghijklmnopqrstuvwxyz"];
[hasher encrypt:@123456789, nil]; // @"zdrnoaor"
此代码的目的是将生成的散列放置在可见位置——例如URL中。
因此,算法尝试避免生成最常用的英语 curse words,方法是绝不会把以下字母放在一起:c, C, s, S, f, F, h, H, u, U, i, I, t, T
。
没有冲突。您生成的散列应该是唯一的。
真正的加密散列无法解密。然而,为了使事情简单,我们广泛的用“hash”一词来指代生成的随机字符集,就像YouTube hash一样。