zoukankan      html  css  js  c++  java
  • 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多个丫鬟。

  • 相关阅读:
    牛客(14)链表中倒数第k个结点
    牛客(13)调整数组顺序使奇数位于偶数前面
    牛客(12)数值的整数次方
    牛客(11)二进制中1的个数
    牛客(10)矩形覆盖
    牛客(9)变态跳台阶
    牛客(8)跳台阶
    牛客(7)斐波那契数列
    Docker数据卷
    Docker镜像
  • 原文地址:https://www.cnblogs.com/kinglandsoft/p/9553473.html
Copyright © 2011-2022 走看看