红鱼儿

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位数的验证码?

分两步:

  1. 引用kbmMWRandom单元
  2. 做一个函数生成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多个丫鬟。

 

posted on 2018-08-29 11:55  红鱼儿  阅读(869)  评论(0编辑  收藏  举报