private void doSignatureGeneration(Set<FunctionSymbol> functions, TaskMonitor monitor)
			throws QueryDatabaseException {
		if (functions.isEmpty()) {
			return;
		}

		if (signatureGenerator == null) {
			signatureGenerator = createSignatureGenerator();
		}
		try {
			signatureGenerator.setVectorFactory(database.getLSHVectorFactory());
		}
		catch (LSHException e1) {
			throw new QueryDatabaseException(e1);
		}

		monitor.setMessage("Hashing function signatures...");
		FunctionSymbolIterator iter = new FunctionSymbolIterator(functions.iterator());
		int count = functions.size();
		try {
// TODO: do this work in a loop so that one failure doesn't stop the entire process...the 
//		 downside is losing parallelization
			signatureGenerator.scanFunctions(iter, count, monitor);
		}
		catch (DecompileException e) {
			throw new QueryDatabaseException(e);
		}
	}
Returns a string explaining the database compatibility between this client and the server.

@return a string explaining the compatibility, or null if it could not be determined
Ghidra/Features/BSim/src/main/java/ghidra/features/bsim/query/facade/SimilarFunctionQueryService.java