gpt4 book ai didi

java - 如何从 JAVA 中的日期获取 md5 总和,例如在 oracle 中?

转载 作者:行者123 更新时间:2023-11-30 09:47:34 25 4
gpt4 key购买 nike

我有下一个麻烦。在数据库中,日期从日期存储为 md5。当我在 JAVA 中从同一日期制作 md5 时,我有另一个哈希。例如:日期 - 01.02.1980java 哈希是 addaf0f9a1fb3699871293f888f6e46e(与来自字符串的 oracle md5 哈希相同)oracle 哈希是 DF0919EA828A77DC2CCF68474ED703AC

我试图在 java 中重复 oracle 结果:

System.out.println(streamConvertor.getHash("01.02.1980", Boolean.TRUE));
System.out.println("");
System.out.println(streamConvertor.getHash("01.02.1980", Boolean.FALSE));

public String getMD5(String input, Boolean is_date) throws ParseException {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] mdinput;
Boolean pr;
if (input.equals("01.02.1980")) {
pr = true;
} else {
pr = false;
}

if (is_date == Boolean.TRUE) {
SimpleDateFormat df = new SimpleDateFormat("dd.MM.yyyy");
Date day = df.parse(input);
mdinput = df.format(day).getBytes();
} else {
mdinput = input.getBytes();
}
if (pr == Boolean.TRUE) {
System.out.println("Is date " + is_date + " - " + mdinput);
}
byte[] messageDigest = md.digest(mdinput);
if (pr == Boolean.TRUE) {
System.out.println("message - " + messageDigest);
}
BigInteger number = new BigInteger(1, messageDigest);
if (pr == Boolean.TRUE) {
System.out.println("Number - " + number);
}
String hashtext = number.toString(16);
// Now we need to zero pad it if you actually want the full 32 chars.
while (hashtext.length() < 32) {
hashtext = "0" + hashtext;
}
if (pr == Boolean.TRUE) {
System.out.println("hashtext - " + hashtext);
}
return hashtext;
}
catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}

输出是不同的,但只是在 byte[] 转换为 BigInteger 之前:

Is date true - [B@4a65e0
message - [B@665753
Number - 231093251542199165689934828427325924462
hashtext - addaf0f9a1fb3699871293f888f6e46e

Is date false - [B@ef22f8
message - [B@1e0cf70
Number - 231093251542199165689934828427325924462
hashtext - addaf0f9a1fb3699871293f888f6e46e

有没有可能像oracle那样做md5 hash?

最佳答案

在您上面的评论中,您说 Oracle 中使用的确切表达式是:

DBMS_CRYPTO.hash( UTL_RAW.CAST_TO_RAW( UPPER(to_date('01.02.1980', 'dd.mm.yyyy')) ),2 )

因此,您使用适当的格式将字符串 '01.02.1980' 转换为 DATE。然后将结果传递给 UPPER();这将导致 DATE 使用 session 的默认日期格式隐式转换为字符串。因此,如果在不同的环境中执行此表达式的结果可能会有所不同。

要尝试在 Java 中重现相同的哈希值,请使用 NLS_DATE_FORMAT 实例参数指示的日期格式。但这可能适用于某些条目而不适用于其他条目,因为使用的日期格式可能有所不同。

基本上,您在创建和存储这些散列值的 Oracle 代码中有一个非常严重的错误。将日期隐式转换为字符串可能很危险。

关于java - 如何从 JAVA 中的日期获取 md5 总和,例如在 oracle 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6625248/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com