package NET.worlds.scape; public class CDDBHash { public static String hashString(CDTrackInfo tracks) { String id = Integer.toHexString(hash(tracks)); int len = id.length(); if (len >= 8) { return id; } else { String pad = "0"; while (++len < 8) { pad = pad + "0"; } return pad + id; } } public static String lookupString(CDTrackInfo tracks) { int numTracks = tracks.getNumTracks(); String ret = hashString(tracks) + " " + numTracks; for (int i = 0; i < numTracks; i++) { ret = ret + " " + tracks.getStartFrames(i); } return ret + " " + leadOutSecs(tracks); } private static int addDigits(int n) { String buf = "" + n; int ret = 0; for (int i = 0; i < buf.length(); i++) { ret += buf.charAt(i) - '0'; } return ret; } private static int leadOutSecs(CDTrackInfo tracks) { int last = tracks.getNumTracks() - 1; int omin = tracks.getPosM(last); int osec = tracks.getPosS(last); int ofrm = tracks.getPosF(last); int lmin = tracks.getLenM(last); int lsec = tracks.getLenS(last); int lfrm = tracks.getLenF(last); if (++lfrm == 75) { lfrm = 0; if (++lsec == 60) { lsec = 0; lmin++; } } ofrm += lfrm; osec += ofrm / 75 + lsec; omin += osec / 60 + lmin; osec %= 60; return omin * 60 + osec; } private static int hash(CDTrackInfo tracks) { int n = 0; int numTracks = tracks.getNumTracks(); for (int i = 0; i < numTracks; i++) { n += addDigits(tracks.getPosM(i) * 60 + tracks.getPosS(i)); } int t = leadOutSecs(tracks) - tracks.getPosM(0) * 60 - tracks.getPosS(0); return n % 255 << 24 | t << 8 | numTracks; } }