三个随机产生密码的存储过程

协助一个朋友做一个小网站,其中一个功能,是让用户注册成功之后,系统将随机产生一个登录密码,并自动发送至注册邮箱中,朋友的做法是为了用户使用真实邮箱。

随机产生密码,Insus.NET总结了三个,并分别写成了存储过程。

第一个,

ExpandedBlockStart.gif usp_RandomPassword
CREATE  PROCEDURE  [ dbo ]. [ usp_RandomPassword ] 
(
    @Length  INT  =  8
)
AS
BEGIN      
     DECLARE  @RandomPassword  NVARCHAR( MAX= N '', @L  INT  =  1
     WHILE  @L  <=  @Length   -- 循环密码长度
     BEGIN
         -- 随机产生每一位字符,ASCII码48至122
         DECLARE  @RndChar  CHAR( 1=  CHAR( ROUND( RAND()  * ( 122 - 48 + 1+  48, 0))
         -- 随机产生的字符不包括下面字符
         IF  ASCII( @RndCharNOT  IN( 58, 59, 60, 61, 62, 63, 64, 91, 92, 93, 94, 95, 96--  : , ; , < , = , > , ? ,@ , [ , \ , ] , ^ , _ , `
         BEGIN
             SET  @RandomPassword  =  @RandomPassword  +  @RndChar
             SET  @L  =  @L  +  1
         END        
     END
     SELECT  @RandomPassword
END

 

第二个,

ExpandedBlockStart.gif usp_RandomPassword
CREATE  PROCEDURE  [ dbo ]. [ usp_RandomPassword ] 
(
    @Length  INT  =  8
)
AS
BEGIN  
     DECLARE  @RandomPassword  NVARCHAR( MAX= N '', @L  INT  =  1
     -- 随机密码将由下面字符串产生,数字0-9,大写字母A-Z,小写字母a-z
     DECLARE  @BaseString  VARCHAR( 255=  ' 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz '  
     WHILE  @L  <=  @Length  -- 循环密码长度
     BEGIN
         -- 61是变量@BaseString的长度减一
         SET  @RandomPassword  =  @RandomPassword  +  SUBSTRING( @BaseStringCONVERT( INT, ROUND( RAND()  *  61  +  1, 0)), 1)
         SET  @L  =  @L  +  1
     END
     SELECT  @RandomPassword
END

 

第三个,

ExpandedBlockStart.gif usp_RandomPassword
CREATE  PROCEDURE  [ dbo ]. [ usp_RandomPassword ] 
(
    @Length  INT  =  8
)
AS
BEGIN  
     DECLARE  @RandomPassword  NVARCHAR( MAX= N '' 
     DECLARE  @R  TINYINT, @L  INT  =  1      
     WHILE   @L  <=  @Length  -- 循环密码长度
     BEGIN
         SET  @R  =  ROUND( RAND()  *  20)     -- 随机产生0,1,2整数
         IF  @R  =  0  -- 当变量为0时,将随机产生一位数字
             SET  @RandomPassword  =  @RandomPassword  +  CHAR( ROUND( RAND()  *  9  +  48, 0)) 
         ELSE  IF  @R  =  1  -- 当变量为1时,将随机产生一位大写字母
             SET  @RandomPassword  =  @RandomPassword  +  CHAR( ROUND( RAND()  *  25  +  65, 0)) 
         ELSE  IF  @R  =  2  -- 当变量为2时,将随机产生一位小写字母
             SET  @RandomPassword  =  @RandomPassword  +  CHAR( ROUND( RAND()  *  25  +  97, 0))            
         SET  @L  =  @L  +  1
     END
     SELECT  @RandomPassword
END

 

最后一个也可以重构写成:

ExpandedBlockStart.gif usp_RandomPassword
CREATE  PROCEDURE  [ dbo ]. [ usp_RandomPassword ] 
(
    @Length  INT  =  8
)
AS
BEGIN  
     DECLARE  @RandomPassword   NVARCHAR( MAX= N '', @L  INT  =  1   
     WHILE  @L  <=  @Length  -- 循环密码长度
     BEGIN         
         DECLARE  @R  INT  =  ROUND( RAND()  *  20
         SET  @RandomPassword  =  @RandomPassword  +  CASE  @R
         WHEN  0  THEN  CHAR( ROUND( RAND()  *  9  +  48, 0)) 
         WHEN  1  THEN  CHAR( ROUND( RAND()  *  25  +  65, 0)) 
         WHEN  2  THEN  CHAR( ROUND( RAND()  *  25  +  97, 0))  END                            
         SET  @L  =  @L  +  1        
     END
     SELECT  @RandomPassword
END

 

Also reference:

MS SQL随机数  http://www.cnblogs.com/insus/archive/2012/01/27/2330058.html

不重复的随机数 http://www.cnblogs.com/insus/archive/2012/01/27/2330104.html

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值