kbmMW随机数与强密码
kbmMW随机数生成器
为了使基于kbmMW开发的项目更安全,其又提供了随机数及强密码生成实现类,拿来即用,让人感觉真是站到巨人的肩膀上好干活!
随机数方面,kbmMW分别提供32及64位的随机数生成器。
32位随机数生成器:
- TkbmMWRandomDelphi
- TkbmMWRandomPCGUInt32
- TkbmMWRandomMersenneTwisterUInt32
64位随机数生成器:
- TkbmMWRandomSplitMix
- TkbmMWRandomXoroshiro128Plus
- TkbmMWRandomXoroshiro1024
- TkbmMWRandomMersenneTwisterUInt64
使用这些类,需要引用kbmMWRandom,然后建立对应的类实例,调用Random方法,基本同Delphi内置的用法一样。
var r32:TkbmMWRandomPCGUInt32; begin r32:=TkbmMWRandomPCGUInt32.Create; try for j:=1 to 100 do begin Memo1.Lines.Add(inttostr(r32.Random)); end; finally r32.Free; end; end;
这些类都是TkbmMWCustomRandom的子类,看一下TkbmMWCustomRandom的Public声明:
public constructor Create; virtual; destructor Destroy; override; class function Make:T; overload; virtual; class function Make(const ARange:T):T; overload; virtual; class function Make(const ARangeLow:T; const ARangeHigh:T):T; overload; virtual; class function MakeFraction:double; virtual; class function MakeDouble:double; overload; virtual; class function MakeDouble(const ARangeLow:double; const ARangeHigh:double):double; overload; virtual; function Random:T; overload; function Random(const ARange:T):T; overload; function Random(const ARangeLow:T; const ARangeHigh:T):T; overload; procedure Seed(const ASeed:T); function RandomFraction:double; virtual; abstract; function RandomDouble:double; overload; virtual; abstract; function RandomDouble(const ARangeLow:double; const ARangeHigh:double):double; overload; virtual; abstract; property Bits:integer read GetBits; property ThreadSafe:boolean read FThreadSafe write FThreadSafe; end;
可以看到,这些类支持线程安全,同时还可以生成浮点型随机数,生成指定范围的随机数,非常适用于实际项目。
对于这些不同的随机数生成器间存在的优劣,可以参考下面的资源:
http://xoroshiro.di.unimi.it/
http://www.pcg-random.org/
经过上面的了解,我们来个实际的案例,如何生成6位数的验证码?
分两步:
- 引用kbmMWRandom单元
- 做一个函数生成6位数验证码
//生成6位随机验证码 function GenValidCode: Integer; begin //这是Delphi内置写法 //Randomize; //Result := RandomRange(100001, 999999); //用kbmMW实现的随机数生成器取代Delphi内置写法 Result:=TkbmMWRandomPCGUInt32.Make(100000,999999); end;
密码生成器
基于kbmMW随机数生成器,作者还进一步实现了强密码的生成,并且提供了两个密码生成器和一个基本框架,如果这两个不满足你,那基于这个框架可以开发自己的密码生成器。下面两个类是kbmMW内置的:
- TkbmMWMixerPasswordGen
- TkbmMWKoremutakePasswordGen
TkbmMWMixerPasswordGen,称之为混合密码生成器,支持设置生成密码的最小及最大的个数,标点符号的最小与最大个数,是否是大小写混合的密码及密码的最小长度。如生成这样的密码:9rn=FM1Q
TkbmMWKoremutakePasswordGen,Koremutake密码生成器生成随机64位值,并将该64位值转换为由两个和三个字符组成的字符串,形成可发送密码。如生成这样的密码:HYFEBRYGROFEDRABOVYNE
var pg:TkbmMWMixerPasswordGen; begin pg:=TkbmMWMixerPasswordGen.Create; try //可选择设置数字,标点符号的长度及是否包含大小写字母。 //默认密码最少8个字符, //包含1到4位数字,没有标点符号 //并使用大小写混合字符。 Memo1.Lines.Add(pg.Generate); finally pg.Free; end; end; //生成密码:69vcRPhw
var pg:TkbmMWKoremutakePasswordGen; begin pg:=TkbmMWKoremutakePasswordGen.Create; try Memo1.Lines.Add(pg.Generate); finally pg.Free; end; end; //生成密码:GUMIPAVYGRYTIFOFYSI
最后,如果使用内置的密码生成器,别忘记引用单元:kbmMWPassword
kbmMW为我们在实际项目中可能遇到的需求都提供了具体实现,拿来用就好了,有了kbmMW,再也不用自己造轮子,怎一个爽字了得。
拥有了kbmMW,不仅仅拥有了跨平台的三层框架,同时还拥有了类似上面在实际项目中要遇到的需求实现。这如同娶了一个媳妇,还带N多个丫鬟。