1.需求
要求是很簡單的,每個驗證碼的有效時間是2小時
,這個并不是收到驗證碼開始計時的,而是每個兩小時的時間段使用的是相同的驗證碼。
2.代碼實現(xiàn)
2.1 依賴
<dependency>
<groupId>gov.nist.math</groupId>
<artifactId>jama</artifactId>
<version>1.0.3</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.6</version>
</dependency>
2.2 時間參數(shù)處理方法
將2個小時處理為相同的值
:文章來源:http://www.zghlxwxcb.cn/news/detail-755628.html
@Slf4j
public class VerificationCodeUtil {
/**
* 時間字符串
*
* @param dateStr yyyy-MM-dd HH:mm:ss
*/
public static String getCode(String dateStr) {
int dataStrLength = 13;
try {
if (dateStr.length() >= dataStrLength) {
String yearMonthDay = dateStr.substring(0, 10);
int hour = Integer.parseInt(dateStr.substring(11, 13));
int twoHour = 2;
if (hour % twoHour != 0) {
hour--;
}
String md5Str = DigestUtils.md5Hex("vc#" + yearMonthDay + hour);
return getCodeByMd5(md5Str);
} else {
log.error("dateStr [{}] not match format [yyyy-MM-dd HH:mm:ss]!", dateStr);
}
} catch (Exception e) {
e.printStackTrace();
log.error("dateStr [{}] not match format [yyyy-MM-dd HH:mm:ss]!", dateStr);
}
return dateStr;
}
}
2.3 截取驗證碼方法
@Slf4j
public class VerificationCodeUtil {
// 對指定字符串生成驗證碼
private static String getCodeByMd5(String md5Str) {
try {
byte[] md5 = md5Str.getBytes();
double[][] preMatrix = new double[4][8];
for (int j = 0; j < 4; j++) {
for (int k = 0; k < 8; k++) {
preMatrix[j][k] = md5[j * 8 + k];
}
}
Matrix matrix = new Matrix(preMatrix);
Matrix matrix1 = matrix.getMatrix(1, 2, 2, 5);
Matrix matrix2 = matrix.transpose();
Matrix matrix21 = matrix2.getMatrix(0, 3, 0, 3);
Matrix matrix22 = matrix2.getMatrix(4, 7, 0, 3);
Matrix matrix3 = matrix21.plus(matrix22);
Matrix result = matrix1.times(matrix3);
double[][] re = result.getArray();
StringBuilder str = new StringBuilder();
for (double[] doubles : re) {
for (double aDouble : doubles) {
int a = (int) aDouble % 16;
str.append(Integer.toHexString(a));
}
}
return str.toString().toUpperCase();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
2.4 驗證方法
@Slf4j
public class VerificationCodeUtil {
public static void main(String[] args) {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
DateTime parse = DateUtil.parse("2023-11-09 23:59:59", "yyyy-MM-dd HH:mm:ss");
String format = df.format(parse);
System.out.println(getCode(format));
// 00:00 3A756DFC
// 00:59 3A756DFC
// 01:59 3A756DFC
// 01:59 3A756DFC
// 02:00 9E937D4B
// 02:59 9E937D4B
// 03:00 9E937D4B
// 22:00 D014DD79
// 23:59 D014DD79
}
}
3.總結
很簡單的算法分享。優(yōu)點:文章來源地址http://www.zghlxwxcb.cn/news/detail-755628.html
- 不需要將生成的驗證碼緩存。
- 時間入?yún)?,能夠重復獲取相同的值。
到了這里,關于Java【算法 05】通過時間獲取8位驗證碼(每兩個小時生成一個)源碼分享的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!