Hallo zusammen,
Ich versuche mich gerade daran, einen MD5-Hash nach Hex zu entführen. Irgendwie funktioniert die (Hex-)Berechnung aber für grössere Zahlen hinten und vorne nicht, weder mit long noch mit BigInteger Was ist hier falsch?
getHexMD5 liefert bei mir «18C-12-99999992CA0-585-11-2A-7F-4C-80», wenn ich aber «99999992CA0» umrechne, bekomme ich «10555311598752» (was ungefähr nicht der Zahl vom MD5-Hash entspricht: -396-18-5833311455505597-11424-1413-17-42-127-76-128). Verwende ich long anstelle von BigInteger, bekomme ich noch ein anderes Resultat. ???
Granjow
Ich versuche mich gerade daran, einen MD5-Hash nach Hex zu entführen. Irgendwie funktioniert die (Hex-)Berechnung aber für grössere Zahlen hinten und vorne nicht, weder mit long noch mit BigInteger Was ist hier falsch?
Code:
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Random;
public class GenerateID {
static final Random rand = new Random();
public static void p(Object o) {
System.out.println((o == null ? o : o.toString()));
}
public static String getMD5(String s) {
StringBuffer out = new StringBuffer();
try {
MessageDigest md = MessageDigest.getInstance("SHA");
byte[] b = s.getBytes();
b = md.digest(b);
for (int i = 0; i < b.length; i++) {
out.append((int) b[i]);
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return out.toString();
}
public static String toHex(long input) {
StringBuffer hex = new StringBuffer();
for (int i = 1; i < 8; i++) {
int c = (int) (input % 16);
hex.append(getHexChar(c));
input -= c;
input = (long) input / 16;
}
hex = hex.reverse();
while (hex.length() > 0)
if (hex.charAt(0) == '0')
hex.deleteCharAt(0);
else
break;
return hex.toString();
}
public static String toHexBi(BigInteger input) {
StringBuffer hex = new StringBuffer();
for (int i = 1; i < 8; i++) {
int c = Integer.parseInt((input.mod(new BigInteger("16"))).toString());
hex.append(getHexChar(c));
input.subtract(new BigInteger("" + c));
input.divide(new BigInteger("16"));
}
hex = hex.reverse();
while (hex.length() > 0)
if (hex.charAt(0) == '0')
hex.deleteCharAt(0);
else
break;
return hex.toString();
}
public static String getHexChar(int i) {
if (i >= 16)
return "err";
if (i < 10)
return new String("" + i);
else {
return new String("ABCDEF".charAt(i - 10) + "");
}
}
public static String getHexMD5(String s, String part) {
StringBuffer hmd5 = new StringBuffer();
s = getMD5(s);
System.out.println(s);
String[] integers = s.split("-");
for (String integer : integers) {
try {
hmd5.append(toHex(Integer.parseInt(integer)) + part);
} catch (Exception e) {
if (integer.length() == 0)
;
else if (integer.length() < 10) {
e.printStackTrace();
System.out.println("Length < 10: >" + integer + "<");
} else {
// long l = Integer.parseInt(integer.substring(0, 9));
BigInteger l = new BigInteger(integer.substring(0, 9));
BigInteger m = new BigInteger("1000000000");
l.multiply(m);
l.add(new BigInteger(integer.substring(9, integer.length())));
// l *= 1000000000;
// l += Integer.parseInt(integer.substring(9, integer.length()));
hmd5.append(toHexBi(l));
}
}
}
if (hmd5.length() > 0) {
hmd5.deleteCharAt(hmd5.length() - 1);
}
return hmd5.toString();
}
public static long hexToLong(String hex) {
long l = 0;
hex = hex.toLowerCase();
hex = new StringBuffer(hex).reverse().toString();
System.err.println(hex);
for (int i = 0; i < hex.length(); i++) {
p("0123456789abcdef".indexOf(hex.charAt(i)) + ",");
l += "0123456789abcdef".indexOf(hex.charAt(i)) * Math.pow(16, i);
p("0123456789abcdef".indexOf(hex.charAt(i)) * Math.pow(16, i));
}
return l;
}
public static void main(String[] args) {
System.out.println(getHexMD5("aasd asd asdf aölkj", "-"));
System.out.println(hexToLong("99999992CA0"));
}
}
getHexMD5 liefert bei mir «18C-12-99999992CA0-585-11-2A-7F-4C-80», wenn ich aber «99999992CA0» umrechne, bekomme ich «10555311598752» (was ungefähr nicht der Zahl vom MD5-Hash entspricht: -396-18-5833311455505597-11424-1413-17-42-127-76-128). Verwende ich long anstelle von BigInteger, bekomme ich noch ein anderes Resultat. ???
Granjow