4个版本
0.2.0 | 2021年2月7日 |
---|---|
0.1.2 | 2018年1月31日 |
0.1.1 | 2018年1月25日 |
0.1.0 | 2018年1月25日 |
#1500 in 编码
19KB
258 行
weird
为64位值提供的加盐Base32编码。
Crockford Base32编码最常用于使数字标识符稍微更易于用户识别。类似于Hashids,这里的目的也是使标识符更短,更不易混淆。与Hashids不同,Crockford Base32在编码之外不做任何隐藏数字真实值的事情,并且当你看到相邻的标识符时,它们的顺序性仍然相当明显。这就是Weird与Crockford的不同之处。
而不是直接将值编码为Base32,weird使用一个打乱的字母表并应用于编码值的任意盐。这是为了让任何观察者看起来像是非顺序数据,并使基于编码标识符推导原始标识符更加困难。
这个库不支持对任意数据的编码和解码;有一个其他库用于此。此外,规范支持校验位数字的想法,但这个库目前不支持。
这个库的主要目的是提供高性能、用户难以识别的数字标识符编码。为此,编码和解码实际上都相当快。有多快?根据我的测试,基于此库的crockford
(此库基于此)解码比harsh
快五十倍,编码快二十七倍。考虑到它执行了额外的操作,这个库的速度大约是它的一半。
用法
与原始的crockford
库不同,在使用之前必须配置weird::Weird
的一个实例。用户可以根据盐创建一个实例,也可以根据盐和字母表创建一个实例。(有关字母表的更多信息,请参阅文档。)
字母表本身是基于一种不太可能改变的rand::Rng
实现生成的(也就是说:我太懒了,不想改变它),因此应该为这个构造函数提供稳定的函数。如果您不愿意相信我(可以理解!),请实现自己的rng并将其传递给Alphabet
构造函数。
编码
// A salt can be anything that translates into a slice of bytes.
let weird = Weird::from_salt("Salt goes here");
let encoded = weird.encode(13); // I have no idea what this would look like.
// It's random, remember?
B计划(更快的编码)
Weird::encode_into()
方法允许直接编码到std::fmt::Write
。这允许重复使用缓冲区或者...你知道,你想做什么。实际上,标准的编码机制就是基于这个实现的;它只是简单地解包结果,因为当然,编码到字符串是不会真正失败的。
解码
解码可能会失败(因为解码器可以接受任意字符串),所以它返回一个结果。
let weird = Weird::from_salt("Salt goes here.");
let decoded = weird.decode("Hello, world!"); // I bet this isn't valid.
let id = match decoded {
Ok(id) => id,
Err(_) => {
println!("I knew that wasn't valid!");
return;
}
};
依赖项
~315KB