怎样生成一个礼品卡的卡号?

yh3301 2011-10-27 10:32:16
本人新手,刚接到一个任务。要做一个礼品卡系统。该礼品卡要有金额,生成日期以及随机码了,但是生成的随机码不能重复,以保证同一天生成的礼品卡中没有重复的(虽然重复的概率很小)。我自己有个初步方案:

1.第1到8位 为随机码(数字加字母)
2.第9到10位 为礼品卡金额
3.第11到12位 为生成礼品卡的日期
4.第13到14位 为生成礼品卡的月份
5.第15到16位 为生成礼品卡的年份的后两位

一次可以同时生成几张同一金额的礼品卡,怎样防止重复?最好希望有代码贴出~~
...全文
1095 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
菖蒲老先生 2011-10-27
  • 打赏
  • 举报
回复
改了一下,不知道还有没有问题。。。


List<String> codes = new ArrayList<String>();

int length = 10;
boolean isExist = false;
String random = null;

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String date = sdf.format(new Date());

do {
random = RandomStringUtils.randomAlphanumeric(8);
isExist = false;
for (int i = 0; i < codes.size(); i++) {
if (random.equals(codes.get(i))) {
isExist = true;
break;
}
}
if (!isExist) {
codes.add(date + random);
}
} while (isExist || codes.size() < length);

for (int i = 0; i < codes.size(); i++) {
System.out.println(codes.get(i));
}
菖蒲老先生 2011-10-27
  • 打赏
  • 举报
回复
没测,好像有点问题。。。
菖蒲老先生 2011-10-27
  • 打赏
  • 举报
回复
需要导入commons-lang.jar



import org.apache.commons.lang.RandomStringUtils;

public class Test {

/**
* @param args
*/
public static void main(String[] args) {

List<String> codes = new ArrayList<String>();

int length = 10;

String random = RandomStringUtils.randomAlphanumeric(8);
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String date = sdf.format(new Date());

boolean isExist = false;
int loop = 0;

do {
loop++;
isExist = false;
for (int i = 0; i < codes.size(); i++) {
if (random.equals(codes.get(i))) {
isExist = true;
break;
}
}
random = RandomStringUtils.randomAlphanumeric(8);
codes.add(date + random);
} while (isExist || loop < length);

for (int i = 0; i < codes.size(); i++) {
System.out.println(codes.get(i));
}
}
}

9441 2011-10-27
  • 打赏
  • 举报
回复
最简单的办法就是设置数据库的唯一索引
nizhicheng 2011-10-27
  • 打赏
  • 举报
回复
时间戳~ 肯定不重复的~~~
或者自己用随机数生成 ~~每次生成判断是否有重复 ,有重复重新生成~~
yh3301 2011-10-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 chaluhe003 的回复:]
随机码加上 当前日期 年月日 时分秒
[/Quote]

这样的话 貌似卡号有点长~~~~
chaluhe003 2011-10-27
  • 打赏
  • 举报
回复
随机码加上 当前日期 年月日 时分秒
zltree 2011-10-27
  • 打赏
  • 举报
回复
声明一个集合 每次生成卡号 (方法你说的就行或者其他随机生成方法很多) 存入集合
首先判断集合里有没有重复(list.contains()) 有重复重新生成 无重复就添加到集合里
良才2015 2011-10-27
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 yang3301happy 的回复:]
引用 11 楼 yjflinchong 的回复:
用oracle 序列


我们用的是mysql。用oracle序列,能讲清楚点吗?实现的细节~~~
[/Quote]
create sequence DMSYS.DM$EXPIMP_ID_SEQ
minvalue 20111027000000000001
maxvalue 99999999999999999999
start with 1
increment by 1
cache 20;

从20111027000000000001开始,每次增加1,一直到99999999999999999999。这样肯定不会重复的拉。当你能增加到99999999999999999999得时候,说明你老板发财了,呵呵。如果真得发财了也好办啊,后面再继续增加位数即可
yh3301 2011-10-27
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 love_se 的回复:]
用UUID自动生成32位字符更好
[/Quote]

这样生成肯定是没有重复的了,但是感觉32位有点长,作为一个礼品卡的话,8到16位就可以了~~

postgrest 2011-10-27
  • 打赏
  • 举报
回复
用UUID自动生成32位字符更好
yingzhuo2011 2011-10-27
  • 打赏
  • 举报
回复
return java.util.UUID.randomUUID.toString().replaceAll("-", "");
yh3301 2011-10-27
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 yjflinchong 的回复:]
用oracle 序列
[/Quote]

我们用的是mysql。用oracle序列,能讲清楚点吗?实现的细节~~~
yjflinchong 2011-10-27
  • 打赏
  • 举报
回复
用oracle 序列
huangmd 2011-10-27
  • 打赏
  • 举报
回复
嗯,不错,学习了
yh3301 2011-10-27
  • 打赏
  • 举报
回复
暂不结贴,大家也可以贴出其他方法
yh3301 2011-10-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 flagiris 的回复:]
改了一下,不知道还有没有问题。。。

Java code

List<String> codes = new ArrayList<String>();

int length = 10;
boolean isExist = false;
String random = null;

SimpleDa……
[/Quote]

呵呵,重要的部分出来了,其他的可以再改改就行了,谢谢

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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