1. 程式人生 > >MD5交並集

MD5交並集

form rar wpa println top ash boolean port []

package example.data;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

public class TFKTest {

    public static void main(String[] args) {
        TFKTest test = new TFKTest();
        test.test();
    }

    /**
     * 計算兩個集合交集
     */
    public void
test() { Node root = new Node(); // 初始化兩條目標數據 Path data = Path.sentenceToPath("b71b060decc045e09769044784588755"); NodeOperate.addNode(root, data); data = Path.sentenceToPath("bacbe8961a0145bb87c9c8ab5f494123"); NodeOperate.addNode(root, data); // 初始化第一顆樹
for (int i = 0; i < 5; i++) { String sentence = makeCharacter(); Path path = Path.sentenceToPath(sentence); NodeOperate.addNode(root, path); } // 第二樹中的一個節點 String sentence = "bacbe8961a0145bb87c9c8ab5f494123"; Path target = Path.sentenceToPath(sentence);
// 交集結果存儲在temp中 Node temp = new Node(); // 進行或者運行 andComputer(root, temp, target); System.err.println("test"); } public String makeCharacter() { String uuid = UUID.randomUUID().toString().replace("-", ""); System.err.println(uuid); return uuid; } public void andComputer(Node root, Node temp, Path path) { if (NodeOperate.existsNode(root, path)) { System.err.println(Path.pathToSentence(path) + ":exists"); NodeOperate.addNode(temp, path); } } public void orCOmputer(Node root, Path path) { } } class Node { char key; Node value; Map<Character, Node> pair; } class NodeOperate { public static void addNode(Node node, Path path) { if (node == null || path == null) { return; } if (contains(node, path)) { Node next = findNode(node, path); if (next != null) { updateNode(node); addNode(next, path.next); } } else { Node next = new Node(); saveNode(node, path, next); addNode(next, path.next); } } public static void addNode0(Node node, Path path) { if (node == null || path == null) { return; } if (contains(node, path)) { Node next = findNode(node, path); addNode(next, path.next); } else { Node next = new Node(); if (node.key != ‘\u0000‘) { updateNode(node); } saveNode(node, path, next); addNode(next, path.next); } } public static Node findNode(Node node, Path path) { if (node.key != ‘\u0000‘) { if (node.key == (path.word)) { return node.value; } } return node.pair.get(path.word); } public static boolean existsNode(Node node, Path path) { Path it = path; Node next = node; int i = 0; do { next = findNode(next, it); if (next != null) { it = it.next; i++; } else { return false; } } while (it != null); return i == 32; } public static void saveNode(Node node, Path path, Node next) { if (node.pair != null) { node.pair.put(path.word, next); } else { node.key = path.word; node.value = next; } } public static void updateNode(Node node) { if (node.pair == null) { node.pair = new HashMap<>(); } node.pair.put(node.key, node.value); node.key = ‘\u0000‘; node.value = null; } public static boolean contains(Node node, Path path) { if (node.pair != null) { return node.pair.containsKey(path.word); } if (node.key != ‘\u0000‘) { return node.key == (path.word); } return false; } } /** * Linked list representation of Pattern Path and Input Path */ class Path extends ArrayList<String> { private static final long serialVersionUID = 1L; public char word; public Path next; public int length; /** * Constructor - class has public members */ private Path() { next = null; word = ‘\u0000‘; length = 0; } /** * convert a sentence (a string consisting of words separated by single spaces) * into a Path * * @param sentence * sentence to convert * @return sentence in Path form */ public static Path sentenceToPath(String sentence) { sentence = sentence.trim(); return arrayToPath(sentence.toCharArray()); } /** * The inverse of sentenceToPath * * @param path * input path * @return sentence */ public static String pathToSentence(Path path) { StringBuilder result = new StringBuilder(32); for (Path p = path; p != null; p = p.next) { result.append(p.word); } return result.toString(); /* * if (path == null) return ""; else return * path.word+" "+pathToSentence(path.next); */ } /** * convert an array of strings to a Path * * @param array * array of strings * @return sequence of strings as Path */ private static Path arrayToPath(char[] array) { Path tail = null; Path head = null; for (int i = array.length - 1; i >= 0; i--) { head = new Path(); head.word = array[i]; head.next = tail; if (tail == null) head.length = 1; else head.length = tail.length + 1; tail = head; } return head; // return arrayToPath(array, 0); } /** * recursively convert an array to a Path * * @param array * array of strings * @param index * array index * @return Path form */ static Path arrayToPath(char[] array, int index) { if (index >= array.length) return null; else { Path newPath = new Path(); newPath.word = array[index]; newPath.next = arrayToPath(array, index + 1); if (newPath.next == null) newPath.length = 1; else newPath.length = newPath.next.length + 1; return newPath; } } /** * print a Path */ public String print() { String result = ""; for (Path p = this; p != null; p = p.next) { result += p.word + ","; } if (result.endsWith(",")) result = result.substring(0, result.length() - 1); return result; } @Override public String toString() { return this.print(); } }

MD5交並集