public void tryCreatePasswordEncoder(final Map<String, PasswordEncoder> encoders) {
        for (var i = 0; i <= MAX_NUM_ENCODERS; i++) {
            val exists = getProperty(SHIRO_ENCODER, i);
            val hasProperty =  containsProperty(SHIRO_ENCODER_GENERATE_PUBLIC_SALT, i)
                || containsProperty(SHIRO_ENCODER_HASH_ALGORITHM_NAME, i)
                || containsProperty(SHIRO_ENCODER_HASH_ITERATIONS, i) || containsProperty(SHIRO_ENCODER_PRIVATE_SALT, i);
            if (StringUtils.isNotBlank(exists) || hasProperty) {

                val passwordService = new DefaultPasswordService();

                if (hasProperty) {
                    val hashService = new DefaultHashService();

                    if (containsProperty(SHIRO_ENCODER_GENERATE_PUBLIC_SALT, i)) {
                        hashService.setGeneratePublicSalt(getPropertyAsBoolean(SHIRO_ENCODER_GENERATE_PUBLIC_SALT, i));
                    }
                    if (containsProperty(SHIRO_ENCODER_HASH_ALGORITHM_NAME, i)) {
                        hashService.setHashAlgorithmName(getProperty(SHIRO_ENCODER_HASH_ALGORITHM_NAME, i));
                    }
                    if (containsProperty(SHIRO_ENCODER_HASH_ITERATIONS, i)) {
                        hashService.setHashIterations(getPropertyAsInteger(SHIRO_ENCODER_HASH_ITERATIONS, i));
                    }
                    if (containsProperty(SHIRO_ENCODER_PRIVATE_SALT, i)) {
                        hashService.setPrivateSalt(ByteSource.Util.bytes(getProperty(SHIRO_ENCODER_PRIVATE_SALT, i)));
                    }

                    passwordService.setHashService(hashService);
                }

                encoders.put(concat(SHIRO_ENCODER, i), new ShiroPasswordEncoder(passwordService));
            }
        }
    }
<p>tryCreatePasswordEncoder.</p>

@param encoders a {@link Map} object
pac4j-config/src/main/java/org/pac4j/config/builder/ShiroEncoderBuilder.java