code: public AtomHashGenerator atomic() {
  
          if (depth < 0) throw new IllegalArgumentException("no depth specified, use .depth(int)");
  
          List<AtomEncoder> encoders = new ArrayList<AtomEncoder>();
  
          // set is ordered
          for (AtomEncoder encoder : encoderSet) {
              encoders.add(encoder);
          }
          encoders.addAll(this.customEncoders);
  
          // check if suppression of atoms is wanted - if not use a default value
          // we also use the 'Basic' generator (see below)
          boolean suppress = suppression != AtomSuppression.unsuppressed();
  
          AtomEncoder encoder = new ConjugatedAtomEncoder(encoders);
          SeedGenerator seeds = new SeedGenerator(encoder, suppression);
  
          AbstractAtomHashGenerator simple = suppress ? new SuppressedAtomHashGenerator(seeds, new Xorshift(),
                  makeStereoEncoderFactory(), suppression, depth) : new BasicAtomHashGenerator(seeds, new Xorshift(),
                  makeStereoEncoderFactory(), depth);
  
          // if there is a finder for checking equivalent vertices then the user
          // wants to 'perturb' the hashed
          if (equivSetFinder != null) {
              return new PerturbedAtomHashGenerator(seeds, simple, new Xorshift(), makeStereoEncoderFactory(),
                      equivSetFinder, suppression);
          } else {
              // no equivalence set finder - just use the simple hash
              return simple;
          }
      }
docs: Given the current configuration create an {@link AtomHashGenerator}.
  
  @return instance of the generator
  @throws IllegalArgumentException no depth or encoders were configured