private void uniqueHash(PcodeOp op, int slot, PcodeSyntaxTree fd) {
		ArrayList<PcodeOp> oplist = new ArrayList<>();
		ArrayList<PcodeOp> oplist2 = new ArrayList<>();
		ArrayList<PcodeOp> champion = new ArrayList<>();
		int method;
		long tmphash = 0;
		Address tmpaddr = null;
		int maxduplicates = 8;

		ToOpEdge move = moveOffSkip(op, slot);
		if (move != null) {
			op = move.getOp();
			slot = move.getSlot();
			if (op == null) {
				hash = 0;
				addrresult = Address.NO_ADDRESS;
				return;
			}
		}
		gatherOpsAtAddress(oplist, fd, op.getSeqnum().getTarget());
		for (method = 4; method < 7; ++method) {
			clear();
			calcHash(op, slot, method);
			if (hash == 0) {
				return;		// Can't get a good hash
			}
			tmphash = hash;
			tmpaddr = addrresult;
			oplist2.clear();
			for (PcodeOp tmpop : oplist) {
				if (slot >= tmpop.getNumInputs()) {
					continue;
				}
				clear();
				calcHash(tmpop, slot, method);
				if (getComparable(hash) == getComparable(tmphash)) {	// Hash collision
					oplist2.add(tmpop);
					if (oplist2.size() > maxduplicates) {
						break;
					}
				}
			}
			if (oplist2.size() <= maxduplicates) {
				if ((champion.size() == 0) || (oplist2.size() < champion.size())) {
					champion = oplist2;
					oplist2 = new ArrayList<>();
					if (champion.size() == 1) {
						break;		// Current hash is unique
					}
				}
			}
		}
		if (champion.size() == 0) {
			hash = 0;
			addrresult = Address.NO_ADDRESS;	// Couldn't find a unique hash
			return;
		}
		int total = champion.size() - 1;	// total is in range [0,maxduplicates-1]
		int pos;
		for (pos = 0; pos <= total; ++pos) {
			if (champion.get(pos) == op) {
				break;
			}
		}
		if (pos > total) {
			hash = 0;
			addrresult = Address.NO_ADDRESS;
			return;
		}
		hash = tmphash | ((long) pos << 49);	// Store three bits for position with list of duplicate hashes
		hash |= ((long) total << 52);	// Store three bits for total number of duplicate hashes
		addrresult = tmpaddr;
	}
Encode a particular PcodeOp and slot
@param op is the PcodeOp to preserve
@param slot is the slot to preserve (-1 for output, >=0 for input)
@param method is the method to use for encoding (4, 5, or 6)
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/pcode/DynamicHash.java