public boolean containsAll(Object o) {
        if (!(o instanceof VictimsRecord)) {
            return false;
        }
        VictimsRecord that = (VictimsRecord) o;

        for (Algorithms algorithm : VictimsConfig.algorithms()) {
            if (!(this.containsAlgorithm(algorithm) && that
                    .containsAlgorithm(algorithm))) {
                // skip if both this and that do not have the current algorithm
                continue;
            }
            HashSet<String> thatHashes = new HashSet<String>(that.getHashes(
                    algorithm).keySet());
            HashSet<String> thisHashes = new HashSet<String>(this.getHashes(
                    algorithm).keySet());

            if (thisHashes.isEmpty() || thatHashes.isEmpty()) {
                // there is no real value in comparing empty sets
                continue;
            }

            if (thisHashes.containsAll(thatHashes)) {
                // we found a subset match
                return true;
            }
        }

        // we have gone through all algorithms without finding a subset match
        return this.hash.equals(that.hash);
    }