常规UUIDshort-uuid-rs
可以缩短。例如,当我想转换 UUID 以适合 Code39 条形码时,这将起作用:
let uuid_str = "420e04de-4f06-4e3b-8718-9f6ede92ea9e";
let custom_alphabet = "0123456789ABCDEFGHJKLMNPQRSTUVWXYZ-.$/+%";
let translator = CustomTranslator::new(custom_alphabet).unwrap();
let uuid = uuid::Uuid::from_str(uuid_str).unwrap();
let short = ShortUuidCustom::from_uuid(&uuid, &translator);
println!("{}", short.to_string()); // prints "0CK3Z2YL23B7.Q1FR8N65R7X6"
但是一旦使用条形码扫描仪扫描短代码,它就需要再次编码常规 UUID。
如何将其转换回来?
我尝试过MindSwipe的解决方案:
let custom_alphabet = "0123456789ABCDEFGHJKLMNPQRSTUVWXYZ-.$/+%";
let translator = CustomTranslator::new(custom_alphabet).unwrap();
// there
let orig_uuid_str = "420e04de-4f06-4e3b-8718-9f6ede92ea9e";
let short = ShortUuidCustom::from_uuid_str(&orig_uuid_str, &translator).unwrap();
let short_uuid_str = &short.to_string();
// and back again
let short = match ShortUuidCustom::parse_str(short_uuid_str, &translator) {
Ok(s) => s,
Err(e) => panic!("{:?}", e),
};
let new_uuid_str = &short.to_uuid(&translator).unwrap().to_string();
assert_eq!(orig_uuid_str, new_uuid_str);
不幸的是,parse_str()
出现了InvalidShortUuid
错误。我想我肯定做错了什么?
看起来
ShortCustomUuid::parse_str
是有缺陷的,或者至少只适用于像 58 个字符的字母表FLICKR_BASE_58
。我在这里报告了一个问题:https://github.com/radim10/short-uuid/issues/4
幸运的是,看起来有一个解决方法,即使用它的
BaseConverter
类型(这是parse_str
内部使用的)手动转换字节:链接的板条箱有一个可以做到这一点的例子(甚至是一个使用自定义字母表的例子),将该示例调整为从字符串解析很简单,如下所示:
使用自定义字母表: