如何生成类似手机冲值卡密码的不重复16位数字?

mmcgzs 2014-04-28 09:28:15
要求:
1、提升密码的安全性,避免用户猜中。
2、密码需要持续生成,比如每月生成5万个,尽量能够不考虑前期数据的情况下避免重复。

等待高手。
...全文
185 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
haitao 2014-04-28
  • 打赏
  • 举报
回复
引用 2 楼 mmcgzs 的回复:
[quote=引用 1 楼 ap0405140 的回复:] 产生16位随机数,

select cast(rand()*10000000000000000 as bigint)
可以保证16位的长度吗?最好不要前面是0的。[/quote] 生成随机的15位,前面再加一位 1-9的随机值
唐诗三百首 2014-04-28
  • 打赏
  • 举报
回复
引用 2 楼 mmcgzs 的回复:
可以保证16位的长度吗?最好不要前面是0的。

-- 建测试表
create table #t(c varchar(50))

create index ix_#t on #t(c)


-- 产生10000个不重复的16位随机数.
set nocount on

declare @x int,@t varchar(50),@r float
select @x=1

while(@x<=10000)
begin
 select @r=rand()
 select @r=case when @r>0.1 then @r else @r+0.1 end
 select @t=rtrim(cast(@r*10000000000000000 as bigint))
 
 if not exists(select 1 from #t where c=@t)
 begin
   insert into #t(c) values(@t)
   select @x=@x+1
 end
end

set nocount off


-- 结果
-- 1 长度统计
select len(c) 'length',
       count(1) 'qty'
 from #t
 group by len(c) 
/*
length      qty
----------- -----------
16          10000

(1 row(s) affected)
*/


-- 2 去重复统计
select count(distinct c) 'qty' from #t
/*
qty
-----------
10000

(1 row(s) affected)
*/
xdashewan 2014-04-28
  • 打赏
  • 举报
回复
做过此类密码生成,但没做过16位那么长的,给你个思路,你可以考虑下,如果有更好的思路也请务必分享下。 无论多少数据,只要在一定范围内,若连续生成,总会被人猜中,所以要对产生的数字加校验位。校验位的复杂程度各种各样,简单的比如,所有数字的总和取后两位做为校验位,或者把英文转化为数字,这样由于用户不能简单的得知你校验位的算法,所以也就无法靠猜连续位数获得其他卡号
mmcgzs 2014-04-28
  • 打赏
  • 举报
回复
引用 1 楼 ap0405140 的回复:
产生16位随机数,

select cast(rand()*10000000000000000 as bigint)
可以保证16位的长度吗?最好不要前面是0的。
唐诗三百首 2014-04-28
  • 打赏
  • 举报
回复
产生16位随机数,

select cast(rand()*10000000000000000 as bigint)
  • 打赏
  • 举报
回复
生成一个guid
select left(REPLACE(newid(),'-',''),16)

CB41550104064DC5

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧