#base32 #identifier #crockford #codec #salt #decoding

weird

基于盐的Crockford Base32编码,生成非顺序输出

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 编码

MIT/Apache

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