code: def hash(cls, scheme, password, salt=None, charset="utf8"):
          
          scheme = scheme.upper()
          cls._test_scheme(scheme)
          if salt is None or salt == b"":
              salt = b""
              cls._test_scheme_nosalt(scheme)
          else:
              cls._test_scheme_salt(scheme)
          try:
              return scheme + base64.b64encode(
                  cls._schemes_to_hash[scheme](password + salt).digest() + salt
              )
          except KeyError:
              if six.PY3:
                  password = password.decode(charset)
                  salt = salt.decode(charset)
              if not crypt_salt_is_valid(salt):
                  raise cls.BadSalt("System crypt implementation do not support the salt %r" % salt)
              hashed_password = crypt.crypt(password, salt)
              if six.PY3:
                  hashed_password = hashed_password.encode(charset)
              return scheme + hashed_password
docs: Hash ``password`` with ``scheme`` using ``salt``.
             This three variable beeing encoded in ``charset``.
  
             :param bytes scheme: A valid scheme
             :param bytes password: A byte string to hash using ``scheme``
             :param bytes salt: An optional salt to use if ``scheme`` requires any
             :param str charset: The encoding of ``scheme``, ``password`` and ``salt``
             :return: The hashed password encoded with ``charset``
             :rtype: bytes