basic-lib/src/main/java/com/streamsets/pipeline/stage/processor/fieldhasher/FieldHasherProcessor.java
private Set<String> validateAndExtractFieldsToHash(
      Record record,
      Set<String> fieldsDontExist,
      Set<String> fieldsWithListOrMapType,
      Set<String> fieldsWithNull,
      Collection<String> matchingFieldsPath
  ) {
    Set<String> validFieldsToHashForThisConfig = new HashSet<String>();
    for (String matchingFieldPath : matchingFieldsPath) {
      if (record.has(matchingFieldPath)) {
        Field field = record.get(matchingFieldPath);
        if (UNSUPPORTED_FIELD_TYPES.contains(field.getType())) {
          fieldsWithListOrMapType.add(matchingFieldPath);
        } else if (field.getValue() == null) {
          fieldsWithNull.add(matchingFieldPath);
        } else {
          validFieldsToHashForThisConfig.add(matchingFieldPath);
        }
      } else {
        fieldsDontExist.add(matchingFieldPath);
      }
    }
    return validFieldsToHashForThisConfig;
  }
private Set<String> validateAndExtractFieldsToHash(
      Record record,
      Set<String> fieldsDontExist,
      Set<String> fieldsWithListOrMapType,
      Set<String> fieldsWithNull,
      Collection<String> matchingFieldsPath
  ) {
    Set<String> validFieldsToHashForThisConfig = new HashSet<String>();
    for (String matchingFieldPath : matchingFieldsPath) {
      if (record.has(matchingFieldPath)) {
        Field field = record.get(matchingFieldPath);
        if (UNSUPPORTED_FIELD_TYPES.contains(field.getType())) {
          fieldsWithListOrMapType.add(matchingFieldPath);
        } else if (field.getValue() == null) {
          fieldsWithNull.add(matchingFieldPath);
        } else {
          validFieldsToHashForThisConfig.add(matchingFieldPath);
        }
      } else {
        fieldsDontExist.add(matchingFieldPath);
      }
    }
    return validFieldsToHashForThisConfig;
  }
Basically throw out map, list map, list and null values fields.