卡号,用户可见,所以无所谓,只好不重复,连续或不连续均可。
我最后是这么搞的。
/** * 生成充值卡前缀. */ private String getCardPreStr() { //16位卡号,第一位固定9,+6位hhmmss,+4位随机数,+5位顺序号 //9 045803 1342 00001 SimpleDateFormat f = new SimpleDateFormat("hhmmss"); return "9" + f.format(new Date())+CommonUtil.getRandomNumString(4); }
用“时分秒”+4位随机数,基本可以保证不重复了。 5位顺序号,单次可以做99999张卡,让他们卡号连续。 ----------------------------------- 至于密码的生成,我是这样想的,不管你用什么NB的算法,最后密码的位数在那放着呢,
穷举的危险是一样的,故,干脆,直接随机数即可。
密码位数越多越好,我这里用的是16位,那么穷举的话,最大尝试次数是10的16次方,是一亿亿次?。
密码还要防止的是,被人发现规律,根据一组密码,猜测出别的密码。
咱这是随机数,没有规律~~所以也无此危险。
虽然是16位,但重复的可能性还是有,但很渺茫了。
故没有采用生成一个,就检查一次的办法。
可以在插入DB后,用自身inner join 检查一下即可,
如:
SELECT count(*) from recharge_card a inner join recharge_card b on a.card_password = b.card_password and a.card_no <> b.card_no
结果是0,就表示无重复。即使有重复,估计也就1条,删掉,重新生成即可。 -------------------------- 另外,充值时,可以按卡号+密码的形式进行匹配,即使密码重复也无所谓,仍然可以定位到一条记录。
用户知道自己的密码有重复,并知道另外一张卡号,基本不可能哈~~ ---------------------------- 充值时,可以增加图形验证码,要求用户登录,限制每天充值次数,限制用户尝试次数。
当然,如果NB的人,注册N个账户,还会换IP,还会识别验证码,穷举的话,
那么,服务端最好延迟1秒返回结果,
1秒,尝试1亿次的话,是1亿秒,大概是1157天,大概3年。
开1万个线程的话,大概3个小时。
也就是说,固定卡号的话,乐观尝试1亿次,开1万个线程,大概3小时,可能收获300元。
一天2400元,也不错,高收益啊~~
不乐观点的话,尝试1000亿次,一天收获两块四,妈的,不够交电费。 -----------------------------------------------
|