我正在生成4个字符的密码,供孩子在学校使用。引脚必须作为4个字符串存储在数据库中。这是我用来生成引脚的方法:
public void generatePin() {
String pin;
Random r = new Random();
for (int i = 0; i < createdStudents.size(); i++) {
int rand = r.nextInt((3998 - 1) + 1) + 1;
if (rand < 10) {
pin = "000" + rand;
} else if (rand < 100) {
pin = "00" + rand;
} else if (rand < 1000) {
pin = "0" + rand;
} else {
pin = "" + rand;
}
createdStudents.get(i).setPin(pin);
}
}
我的问题是:
如果我略微改变了上述方法,将每个引脚添加到String类型的ArrayList中,那么“搜索”该列表并确保一所学校中的2名学生不这样做的最有效方法是什么最终使用相同的图钉?
(注意:每所学校的学生人数不得超过1200)
编辑:
我最终做了以下事情:
public void generatePin() {
List<String> pins = new ArrayList<String>();
String pin;
Random r = new Random();
for (int i = 0; i < createdStudents.size(); i++) {
int rand = r.nextInt((9999 - 1) + 1) + 1;
if (rand < 10) {
pin = "000" + rand;
} else if (rand < 100) {
pin = "00" + rand;
} else if (rand < 1000) {
pin = "0" + rand;
} else {
pin = "" + rand;
}
if (!pins.contains(pin)) {
createdStudents.get(i).setPin(pin);
pins.add(pin);
} else {
i--;
}
}
}
创建一个ArrayList来存储引脚,并在每次生成后检查引脚是否存在于ArrayList中。如果不是,则将其分配给学生。如果是这样,请递减循环计数器,以返回到列表中刚引用的索引并生成一个新的引脚。这将一直持续到生成唯一的图钉并将其分配给学生为止。
答案 0 :(得分:7)
使用Set(因为它不允许重复)来记住并检查已使用的引脚。我将用于生成代码的代码移到了单独的方法中
public void generatePin() {
String pin;
Set<String> generatedPins = new HashSet<>();
for (int i = 0; i < createdStudents.size(); i++) {
do {
pin = generatePinCode();
} while (!generatedPins.add(pin));
createdStudents.get(i).setPin(pin);
}
}
答案 1 :(得分:0)
首先,我将生成图钉,然后将其设置给每个学生。通过强大的算法使用Set和SecureRandom(我想引脚是敏感数据...)。喜欢:
int studentsNumber = 4;
// Securely generate N unique pins
Set<String> pins = new HashSet();
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
while (pins.size() != studentsNumber) {
int pin = sr.nextInt((3998 - 1) + 1) + 1;
String pinStr = String.format("%04d", pin);
pins.add(pinStr);
}
// Set pins to the students
for (Student s : createdStudents) {
for (String pin : pins) {
s.setPin(pin);
}
}
答案 2 :(得分:0)
用于引脚生成的代码(不变):
public String generatePin() {
String pin;
Random r = new Random();
int rand = r.nextInt((3998 - 1) + 1) + 1;
if (rand < 10) {
pin = "000" + rand;
} else if (rand < 100) {
pin = "00" + rand;
} else if (rand < 1000) {
pin = "0" + rand;
} else {
pin = "" + rand;
}
return pin;
}
确保分布式引脚是唯一的:
public void distributeUniquePins() {
List<String> distributedPins = new ArrayList<>();
createdStudents.forEach(student -> {
String pin = generatePin();
while(distributedPins.contains(pin)) {
pin = generatePin();
}
distributedPins.add(pin);
student.setPin(pin);
});
}