目录
在Delphi的最新版本12(Athens) 中,新引进了开源库:sqids。Sqids是一个小型的开源库,可以从数字生成短、唯一、看起来随机的ID。用于链接缩短,为日志生成唯一事件ID,为网站上的产品/对象生成ID(就像YouTube为视频所做的那样),为文本消息生成短ID,邮件确认代码等。
在Delphi中的使用:
一、需要引用的单元:
System.NetEncoding.Sqids
二、具体对象说明:
TSqidsEncoding
提供使用 Sqids 从数字中编码和解码 YouTube 外观 ID 的方法。生成的 ID 很短,可以从自定义字母生成,并保证无碰撞。
1. 对象创建函数:
constructor Create(const AAlphabet: string = ''; AMinHashLength: Integer = 0;
const ABlockList: TArray<string> = nil);
创建 TSqidsEncoding 的新实例。
创建接受以下参数:
- AAlphabet(字母表): 可选的编码字母。默认值为空字符串,这将导致使用 Sqids 默认字母表("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")。
- AMinHashLength: 编码值的最小字符串长度。默认值为 0,即没有下限。
- ABlockList: 编码值的阻塞字符串列表。默认值为空数组,这将导致使用已知脏话列表,而这些脏话可能不适合意外出现在自动生成的 Sqids ID 中。
2. 对象编码函数:
function Encode(const ANumbers: TArray<Integer>): string; overload;
function Encode(const ANumber: Integer): string; overload;
function Encode(const ANumbers: string): string; overload;
编码指定的输入值并返回 Sqids "散列 "字符串值。
编码接受三种数据类型作为参数:
ANumbers: TArray<Integer>(即整数数组)。
ANumber:整数(即单个整数值)。
ANumbers: 字符串(即用逗号分隔的整数值字符串)。
注意:
当参数为负整数时,Encode 会引发异常。
3. 对象解码函数:
function Decode(const AHash: string): TArray<Integer>;
function DecodeSingle(const AHash: string): Integer;
function DecodeToStr(const AHash: string): string;
Decode 解码 Sqids 编码字符串并返回一个整数数组。AHash 是编码字符串的参数。
注意:
当 AHash 包含无效值时,生成的数组只包含第一个成功解码的整数值。所有其他值都将被丢弃。
DecodeSingle 解码 Sqids 编码字符串并返回整数。AHash 是编码字符串的参数。
注意:
当 AHash 包含无效参数或编码值个数不同于 1 时,DecodeSingle 会引发异常。 要解码多个编码值,请使用 Decode。
DecodeToStr 解码 Sqids 编码字符串,并返回一个以逗号分隔的整数值字符串。AHash 是编码字符串的参数。
注意:
当 AHash 包含无效参数时,DecodeToStr 会引发异常。
三、示例:
1. 简单调用示例:
procedure Sqids_Test;
begin
var length := 10; //编码值的最小字符串长度 10
var alphabet := 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
var sqids := TSqidsEncoding.Create(alphabet, length);
var encoded := sqids.Encode(71004); // 编码结果为 'HrqXVtlDrO'
var decodedSingle := sqids.DecodeSingle(encoded); // 解码为一个整数: 710054
var decoded := sqids.Decode(encoded); // 结果将返回一个数组: [710054]
Sqids.Free;
end;
2. 全功能示例:
注意使用以上程序时一定要打开:Skia开关!否则程序执行会出现错误!
四、用途:
Sqids 的主要用途是纯视觉的。如果您想在项目中使用标识符代替数字,Sqids 可能是一个不错的选择。
适用于
- 编码主键 如果使用关系型数据库
- 节省数据库查询 通过编码多个对象
- 临时登录令牌 无粗话,URL 安全
不适用于
- 敏感数据 这不是加密库
- 用户 ID 如果有人找到编码字母表,可以显示用户计数
五、资源连接:
1 . Delphi官网博客
2. Sqids