anchor.diff:  
   .Create Default DelegatingPasswordEncoder
   ====
  -[source,java]
  +.Java
  +[source,java,role="primary"]
   ----
   PasswordEncoder passwordEncoder =
       PasswordEncoderFactories.createDelegatingPasswordEncoder();
   ----
  +
  +.Kotlin
  +[source,kotlin,role="secondary"]
  +----
  +val passwordEncoder: PasswordEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder()
  +----
   ====
   
   Alternatively, you may create your own custom instance. For example:
   
   .Create Custom DelegatingPasswordEncoder
   ====
  -[source,java]
  +.Java
  +[source,java,role="primary"]
   ----
   String idForEncode = "bcrypt";
   Map encoders = new HashMap<>();
  
positive.code: System.out.println(user.getPassword());
  // {bcrypt}$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG
  ----
  ====
  
  If you are creating multiple users, you can also reuse the builder.
  
  .withDefaultPasswordEncoder Reusing the Builder
  ====
  [source,java]
  ----
  UserBuilder users = User.withDefaultPasswordEncoder();
  User user = users
  
negative.code: In order to defeat password cracking on custom hardware scrypt is a deliberately slow algorithm that requires large amounts of memory.
  Like other adaptive one-way functions, it should be tuned to take about 1 second to verify a password on your system.
  
  .SCryptPasswordEncoder
  ====
  .Java
  [source,java,role="primary"]
  ----
  // Create an encoder with all the defaults
  SCryptPasswordEncoder encoder = new SCryptPasswordEncoder();
  String result = encoder.encode("myPassword");
  assertTrue(encoder.matches("myPassword", result));
  ----
  
  .Kotlin
  [source,kotlin,role="secondary"]
  ----
  // Create an encoder with all the defaults
  val encoder = SCryptPasswordEncoder()
  val result: String = encoder.encode("myPassword")
  assertTrue(encoder.matches("myPassword", result))
  ----
  ====
  
  [[authentication-password-storage-other]]
  == Other PasswordEncoders
  