/** Returns the hash of anything passed to {@link #hash(ParseTreeNode)}. */ byte[] getHashBytes() { flushBuffer(); return md.digest(); }
private void hash(Node node) { hash(node.getNodeType()); switch (node.getNodeType()) { case Node.ATTRIBUTE_NODE: case Node.ELEMENT_NODE: hash(node.getNodeName()); break; case Node.TEXT_NODE: case Node.CDATA_SECTION_NODE: hash(node.getNodeValue()); break; } hash((short) node.getChildNodes().getLength()); if (node.getNodeType() == Node.ELEMENT_NODE) { NamedNodeMap attrs = node.getAttributes(); int nAttrs = attrs.getLength(); hash((short) nAttrs); for (int i = 0; i < nAttrs; ++i) { hash(attrs.item(i)); } } for (Node child = node.getFirstChild(); child != null; child = child.getNextSibling()) { hash(child); } }
private void hash(String text) { int n = text.length(); for (int i = 0; i < n; ++i) { char ch = text.charAt(i); if (ch < 0x0080) { requireSpaceInBuffer(1); buffer[++posInBuffer] = (byte) ch; } else if (ch < 0x080) { requireSpaceInBuffer(2); buffer[++posInBuffer] = (byte) (((ch >> 6) & 0x1f) | 0xc0); buffer[++posInBuffer] = (byte) ((ch & 0x3f) | 0x80); } else { requireSpaceInBuffer(3); buffer[++posInBuffer] = (byte) (((ch >> 12) & 0x0f) | 0xe0); buffer[++posInBuffer] = (byte) (((ch >> 6) & 0x3f) | 0x80); buffer[++posInBuffer] = (byte) ((ch & 0x3f) | 0x80); } } }
/** Hashes the given parse tree. */ void hash(ParseTreeNode node) { hash(System.identityHashCode(node.getClass())); Object value = node.getValue(); if (value != null) { if (value instanceof String) { hash((String) value); } else if (value instanceof Node) { hash((Node) value); } else { hash(value.hashCode()); } } List<? extends ParseTreeNode> children = node.children(); hash((short) children.size()); for (ParseTreeNode child : children) { hash(child); } }
private void hash(short n) { requireSpaceInBuffer(2); buffer[++posInBuffer] = (byte) ((n >> 8) & 0xff); buffer[++posInBuffer] = (byte) (n & 0xff); }
/** Flushes the buffer if there is not enough space. */ private void requireSpaceInBuffer(int space) { if (posInBuffer + space >= buffer.length) { flushBuffer(); } }
ModuleCacheKey(ContentType type, ParseTreeNode node) { Hasher hasher = new Hasher(type); hasher.hash(node); this.hashBytes = hasher.getHashBytes(); this.first32Bits = (hashBytes[0] & 0xff) | ((hashBytes[1] & 0xff) << 8) | ((hashBytes[2] & 0xff) << 16) | ((hashBytes[3] & 0xff) << 24); }
private void hash(int n) { requireSpaceInBuffer(4); buffer[++posInBuffer] = (byte) ((n >> 24) & 0xff); buffer[++posInBuffer] = (byte) ((n >> 16) & 0xff); buffer[++posInBuffer] = (byte) ((n >> 8) & 0xff); buffer[++posInBuffer] = (byte) (n & 0xff); }