39 |
|
|
40 |
import java.lang.reflect.Method; |
import java.lang.reflect.Method; |
41 |
import java.lang.Class; |
import java.lang.Class; |
42 |
import gnu.java.security.provider.SHA; |
import gnu.java.io.NullOutputStream; |
43 |
|
import gnu.java.lang.reflect.TypeSignature; |
44 |
|
import java.security.MessageDigest; |
45 |
|
import java.security.DigestOutputStream; |
46 |
|
import java.io.DataOutputStream; |
47 |
|
import java.io.ByteArrayOutputStream; |
48 |
|
|
49 |
public class RMIHashes |
public class RMIHashes |
50 |
{ |
{ |
51 |
|
//There're other places using DigestOutputStream to generate hash in classpath, but I think the way I used |
52 |
|
//here is more efficient, anyway, you can switch to DigestOutputStream by doing like "//or:" comments say. |
53 |
|
|
54 |
|
//or:add this statement: private static final NullOutputStream nullOutputStream = new NullOutputStream (); |
55 |
public static long getMethodHash(Method meth) |
public static long getMethodHash(Method meth) |
56 |
{ |
{ |
57 |
return meth.hashCode (); |
//Object Serialization Spec 8.3 |
58 |
|
try |
59 |
|
{ |
60 |
|
MessageDigest md = MessageDigest.getInstance ("SHA"); |
61 |
|
//or:remove this statement: DigestOutputStream digest_out = new DigestOutputStream (nullOutputStream, md); |
62 |
|
ByteArrayOutputStream digest_out = new ByteArrayOutputStream(); |
63 |
|
DataOutputStream data_out = new DataOutputStream (digest_out); |
64 |
|
|
65 |
|
StringBuffer sbuf = new StringBuffer(); |
66 |
|
sbuf.append(meth.getName()); |
67 |
|
sbuf.append('('); |
68 |
|
Class params[] = meth.getParameterTypes(); |
69 |
|
for(int i = 0; i < params.length; i++) |
70 |
|
sbuf.append(TypeSignature.getEncodingOfClass(params[i])); |
71 |
|
sbuf.append(')'); |
72 |
|
Class rcls = meth.getReturnType(); |
73 |
|
if(rcls != Void.TYPE) |
74 |
|
sbuf.append(TypeSignature.getEncodingOfClass(rcls)); |
75 |
|
else |
76 |
|
sbuf.append('V'); |
77 |
|
|
78 |
|
data_out.writeUTF (sbuf.toString()); |
79 |
|
data_out.flush(); |
80 |
|
data_out.close (); |
81 |
|
|
82 |
|
md.update(digest_out.toByteArray()); //or:remove this statement |
83 |
|
byte[] sha = md.digest (); |
84 |
|
long result = 0; |
85 |
|
int len = sha.length < 8 ? sha.length : 8; |
86 |
|
for (int i=0; i < len; i++) |
87 |
|
result += (long)(sha[i] & 0xFF) << (8 * i); |
88 |
|
return result; |
89 |
|
}catch(Exception _){ |
90 |
|
return -1L; |
91 |
|
} |
92 |
} |
} |
93 |
|
|
94 |
public static long getInterfaceHash(Class clazz) |
public static long getInterfaceHash(Class clazz) |
96 |
return clazz.hashCode (); |
return clazz.hashCode (); |
97 |
} |
} |
98 |
} |
} |
99 |
|
|