From 9c10f99f46d7f8098380032edd1f85b4cd51d560 Mon Sep 17 00:00:00 2001 From: wentch <22250530@qq.com> Date: Mon, 14 Dec 2015 17:42:41 +0800 Subject: [PATCH] --- src/org/redkale/net/sncp/Sncp.java | 85 ++++++++------------ src/org/redkale/net/sncp/SncpClient.java | 4 +- src/org/redkale/net/sncp/SncpDynServlet.java | 2 +- 3 files changed, 38 insertions(+), 53 deletions(-) diff --git a/src/org/redkale/net/sncp/Sncp.java b/src/org/redkale/net/sncp/Sncp.java index 54eb93e95..5979794c4 100644 --- a/src/org/redkale/net/sncp/Sncp.java +++ b/src/org/redkale/net/sncp/Sncp.java @@ -46,7 +46,7 @@ public abstract class Sncp { private static final byte[] hashes = new byte[255]; - static { + static { //64进制 //0-9:48-57 A-Z:65-90 a-z:97-122 $:36 _:95 byte index = 0; hashes['_'] = index++; @@ -83,69 +83,54 @@ public abstract class Sncp { } public static DLong hash(final java.lang.reflect.Method method) { - if (method == null) return new DLong(new byte[16]); - String n = method.getName(); - if (n.length() > 11) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < n.length(); i += 2) { - sb.append(n.charAt(i)); - } - sb.append(n.length()); - n = sb.toString(); - } - long rs1 = hash(n); - if (rs1 < Integer.MAX_VALUE) rs1 |= (method.getParameterCount() + 0L) << 32; + if (method == null) return new DLong(-1, -1); + long rs1 = hash(method.getName()); rs1 = (rs1 < Integer.MAX_VALUE) ? rs1 | 0xF00000000L : rs1; - long rs2 = hash(wrapName(method), true); - if (rs2 < Integer.MAX_VALUE) rs2 |= (method.getParameterCount() + 0L) << 32; + final Class[] params = method.getParameterTypes(); + final StringBuilder sb = new StringBuilder(); + if (params.length < 1) { + sb.append("00"); + } else { + sb.append(params.length); + for (Class clzz : params) { + String s = clzz.getSimpleName(); + sb.append(s.substring(0, s.length() > 1 ? 2 : 1)).append(s.substring(s.length() - 1)); + } + } + long rs2 = hash(sb.toString()); rs2 = (rs2 < Integer.MAX_VALUE) ? rs2 | 0xF00000000L : rs2; return new DLong(rs1, rs2); } - private static String wrapName(final java.lang.reflect.Method method) { - final Class[] params = method.getParameterTypes(); - if (params.length == 0) return method.getName() + "00"; - StringBuilder sb = new StringBuilder(); - for (Class clzz : params) { - String s = clzz.getSimpleName(); - sb.append(s.substring(0, s.length() > 1 ? 2 : 1)).append(s.substring(s.length() - 1)); - } - String n = method.getName(); - if (n.length() > 11) { - StringBuilder zsb = new StringBuilder(); - for (int i = 0; i < n.length(); i += 2) { - zsb.append(n.charAt(i)); - } - zsb.append(n.length()); - n = zsb.toString(); - } - return n + sb + Integer.toString(params.length, 36); - } - + /** + * 对类名或者name字符串进行hash。 + * + * @param name + * @return + */ public static long hash(final String name) { - return hash(name, false); - } - - public static long hash(final String name, boolean reverse) { if (name == null) return Long.MIN_VALUE; if (name.isEmpty()) return 0; - char[] chars = Utility.charArray(name); - long rs = 0L; - if (reverse) { - int start = Math.max(chars.length - 10, 0); - for (int i = chars.length - 1; i >= start; i--) { - rs = (rs << 6) | hashes[0xff & chars[i]]; - } - } else { - int end = Math.min(chars.length, 11); - for (int i = 0; i < end; i++) { + final char[] chars = Utility.charArray(name); + if (chars.length <= 11) { + long rs = 0; + for (int i = 0; i < chars.length; i++) { rs = (rs << 6) | hashes[0xff & chars[i]]; } + return rs; } - return Math.abs(rs); + String len = Integer.toString(chars.length, 36); + long rs = len.length() > 1 ? hashes[0xff & len.charAt(0)] : hashes[0xff & '0']; + rs = (rs << 6) | hashes[0xff & len.charAt(len.length() - 1)]; //前2位用于存放长度 + final int step = (chars.length - 1) / 9 + 1; + for (int i = 0; i < chars.length; i += step) { + rs = (rs << 6) | hashes[0xff & chars[i]]; + } + return rs; } + public static boolean isRemote(Service service) { return service.getClass().getName().startsWith(REMOTEPREFIX); } diff --git a/src/org/redkale/net/sncp/SncpClient.java b/src/org/redkale/net/sncp/SncpClient.java index a2970a50a..0e585a81b 100644 --- a/src/org/redkale/net/sncp/SncpClient.java +++ b/src/org/redkale/net/sncp/SncpClient.java @@ -155,8 +155,8 @@ public final class SncpClient { public String toString() { String service = serviceClass.getName(); if (remote) service = service.replace(Sncp.LOCALPREFIX, Sncp.REMOTEPREFIX); - return this.getClass().getSimpleName() + "(service = " + service + ", serviceid = " + serviceid - + ", name = " + name + ", nameid = " + nameid + ", address = " + (address == null ? "" : (address.getHostString() + ":" + address.getPort())) + return this.getClass().getSimpleName() + "(service = " + service + ", serviceid = " + serviceid + ", nameid = " + nameid + + ", name = " + name + ", address = " + (address == null ? "" : (address.getHostString() + ":" + address.getPort())) + ", groups = " + groups + ", actions.size = " + actions.length + ")"; } diff --git a/src/org/redkale/net/sncp/SncpDynServlet.java b/src/org/redkale/net/sncp/SncpDynServlet.java index e5ec123f5..3065fc2a6 100644 --- a/src/org/redkale/net/sncp/SncpDynServlet.java +++ b/src/org/redkale/net/sncp/SncpDynServlet.java @@ -71,7 +71,7 @@ public final class SncpDynServlet extends SncpServlet { @Override public String toString() { - return this.getClass().getSimpleName() + "(type=" + type.getName() + ", serviceid=" + serviceid + ", actions.size=" + actions.size() + ", name=" + serviceName + ")"; + return this.getClass().getSimpleName() + "(type=" + type.getName() + ", serviceid=" + serviceid + ", nameid=" + nameid + ", actions.size=" + actions.size() + ", name=" + serviceName + ")"; } @Override