/** Update a UID type field - handles Study Instance UID, SOP UID etc */ public static String updateUID(DicomObject ds, int tag, long deident) { String orig = ds.getString(tag); String v = SHA1(orig+deident); String uid = "2.25."+decodeLong(v,0)+"."+decodeLong(v,8)+"."+decodeLong(v,16); ds.putString(tag,null, uid); return v; }
/** Return the long value locations at posn in the hex decoded value */ public static long decodeLong(String hex,int posn) { byte[] data = decodeHex(hex); long ret = 0; for(int i=0; i<8; i++) { ret = (ret << 8) | (data[(posn++) % data.length] & 0xFFl); } ret = Math.abs(ret); return ret; }
public void anonymize(DicomObject ds) { String newPid = updateId(ds,Tag.PatientID,salt); ds.putString(Tag.IssuerOfPatientID,null,"Anon"); long lastId = decodeLong(newPid,0); long firstId = decodeLong(newPid,1); String last = lastNames[(int) (lastId % lastNames.length)]; String sex = ds.getString(Tag.PatientSex); int duration = 1+(int) (decodeLong(newPid,1) % 35600); cal.add(Calendar.DAY_OF_YEAR, -duration); ds.putDate(Tag.PatientBirthDate, VR.DA, cal.getTime()); String newStudyUID = updateUID(ds,Tag.StudyInstanceUID,salt); cal.add(Calendar.DAY_OF_YEAR, (int) (decodeLong(newStudyUID,0) % duration)); ds.putDate(Tag.StudyDate, VR.DA, cal.getTime()); ds.remove(Tag.OtherPatientIDs); ds.remove(Tag.OtherPatientIDsSequence); updateUID(ds,Tag.SeriesInstanceUID, salt); updateUID(ds,Tag.SOPInstanceUID, salt); if( ds.contains(Tag.MediaStorageSOPInstanceUID) ) updateUID(ds,Tag.MediaStorageSOPInstanceUID,salt); updateId(ds,Tag.AccessionNumber,salt); updateId(ds,Tag.StudyID,salt);
public static String SHA1(String text) { try { MessageDigest md; md = MessageDigest.getInstance("SHA-1"); byte[] sha1hash = new byte[40]; md.update(text.getBytes("iso-8859-1"), 0, text.length()); sha1hash = md.digest(); return encodeHex(sha1hash); } catch (NoSuchAlgorithmException e) { throw new Error(e); } catch (UnsupportedEncodingException e) { throw new Error(e); } }
/** Update an ID field - handles Patient ID, Accession#, StudyID etc */ public static String updateId(DicomObject ds, int tag, long deident) { String orig = ds.getString(tag); if( orig==null ) orig = Integer.toHexString(tag); String v = SHA1(orig+deident); v = v.substring(0,14).replace('+','_'); ds.putString(tag,null, v); return v; }