11个版本

0.2.2 2021年10月23日
0.2.1 2020年9月28日
0.2.0 2020年3月31日
0.1.6 2019年1月30日
0.1.2 2016年10月17日

#172编码

Download history 2111/week @ 2024-03-13 2097/week @ 2024-03-20 1250/week @ 2024-03-27 2768/week @ 2024-04-03 2294/week @ 2024-04-10 1723/week @ 2024-04-17 3438/week @ 2024-04-24 1618/week @ 2024-05-01 4256/week @ 2024-05-08 3140/week @ 2024-05-15 2920/week @ 2024-05-22 3124/week @ 2024-05-29 3031/week @ 2024-06-05 2348/week @ 2024-06-12 1833/week @ 2024-06-19 858/week @ 2024-06-26

8,528 每月下载次数
17 crate(直接使用9个)中使用

MIT/Apache

37KB
761

hashids

Harsh 是一个用于生成类似YouTube ID的数字的Rust实现。当你不希望向用户暴露数据库ID时使用它:http://hashids.org/javascript

快速示例

let harsh = Harsh::default();
let id = harsh.encode(&[1, 2, 3]); // "o2fXhV"
let numbers = harsh.decode(id).unwrap(); // [1, 2, 3]

让你的ID唯一

传递一个项目名称以使你的ID唯一

let harsh = Harsh::builder().salt("My Project").build().unwrap();
let id = harsh.encode(&[1, 2, 3]).unwrap(); // "Z4UrtW"

let harsh = Harsh::builder().salt("My Other Project").build().unwrap();
let id = harsh.encode(&[1, 2, 3]).unwrap(); // "gPUasb"

使用填充使你的ID更长

注意,ID仅填充到至少一定长度。这并不意味着你的ID将是 确切 的那个长度。

let harsh = Harsh::default(); // no padding
let id = harsh.encode(&[1]).unwrap() // "jR"

let harsh = Harsh::builder().length(10).build().unwrap(); // pad to length 10
let id = harsh.encode(&[1]).unwrap() // "VolejRejNm"

传递一个自定义字母表

let harsh = Harsh::builder().alphabet("abcdefghijklmnopqrstuvwxyz").build().unwrap(); // all lowercase
let id = harsh.encode(&[1, 2, 3]); // "mdfphx"

将十六进制编码而不是数字编码

如果你想编码Mongo的ObjectId,这很有用。注意,没有限制你可以传递多大的十六进制数字(它不必是Mongo的ObjectId)。

let harsh = Harsh::default();

let id = harsh.encode_hex("507f1f77bcf86cd799439011").unwrap(); // "y42LW46J9luq3Xq9XMly"
let hex = harsh.decode_hex("y42LW46J9luq3Xq9XMly").unwrap(); // "507f1f77bcf86cd799439011" 

陷阱

  1. 在解码时,输出始终是一个数字数组(即使你只编码了一个数字)

    let harsh = Harsh::default();
    
    let id = harsh.encode(&[1]).unwrap();
    println!("{:?}", harsh.decode(&id).unwrap()); // [1]
    
  2. 不支持编码负数。

  3. 如果你向encode()传递虚假输入,将返回一个空字符串

    let harsh = Harsh::default();
    
    let id = harsh.decode("a123"); // note lack of unwrap call; would panic here
    println!("{:?}", id); // ""
    
  4. 不要将此库用作安全工具,也不要编码敏感数据。这不是一个加密库。

随机性

Hashids的主要目的是混淆ID。它不是用来作为安全或压缩工具的,也没有进行过这样的测试。话虽如此,这个算法确实试图使这些ID随机且不可预测。

不会显示重复的数字模式,因此ID中不会有3个相同的数字

let harsh = Harsh::default();
println!("{}", harsh.encode(&[5, 5, 5])); // A6t1tQ

与递增的数字相同

let harsh = Harsh::default();

println!("{}", harsh.encode(&[1, 2, 3, 4, 5, 6, 7, 8, 9, 10])); // wpfLh9iwsqt0uyCEFjHM

println!("{}", harsh.encode(&[1])); // jR
println!("{}", harsh.encode(&[2])); // k5
println!("{}", harsh.encode(&[3])); // l5
println!("{}", harsh.encode(&[4])); // mO
println!("{}", harsh.encode(&[5])); // nR

该死!#$%@

编写此代码的目的是将创建的ID放置在可见位置,如URL。因此,算法试图通过生成以下字母永远不会相邻的ID来避免生成大多数常见的英文诅咒词

c, f, h, i, s, t, u

支持

有问题?在此处创建一个问题,或者找到原始JavaScript库的作者

@IvanAkimovivanakimov.com

也许有一天我会抽出时间来修复我的网站。:)

变更日志

0.2.0

  • 转换为基于结果的API,并添加快速检查测试,感谢Dr-Emann。

0.1.5

  • 修复了解码包含不在字母表中出现的字符的值时的panic问题

0.1.3

  • 移除对clippy的依赖。(仍然在使用clippy,但现在只是作为cargo clippy使用。)

0.1.2

  • HarshFactory更改为HarshBuilder,以停止挠我的强迫症1
  • 更新了依赖项
  1. 对于由此造成的不便,我深表歉意,但我们都清楚从长远来看这是更好的选择;如果我保持理智,我就可以继续更新这个库!

许可证

根据您的选择,许可如下

贡献

除非您明确表示,否则根据Apache-2.0许可证定义的您有意提交以包含在作品中的任何贡献,将按照上述方式双重许可,不附加任何额外条款或条件。

无运行时依赖