docs: def hash(buf, encoding="utf-8"):
      """
      Compute the fuzzy hash of a buffer
  
      :param String|Bytes buf: The data to be fuzzy hashed
      :return: The fuzzy hash
      :rtype: String
      :raises InternalError: If lib returns an internal error
      :raises TypeError: If buf is not String or Bytes
  
      """
  
      if isinstance(buf, six.text_type):
          buf = buf.encode(encoding)
  
      if not isinstance(buf, six.binary_type):
          raise TypeError(
              "Argument must be of string, unicode or bytes type not "
              "'%r'" % type(buf)
          )
  
      # allocate memory for result
      result = ffi.new("char[]", binding.lib.FUZZY_MAX_RESULT)
      if binding.lib.fuzzy_hash_buf(buf, len(buf), result) != 0:
          raise InternalError("Function returned an unexpected error code")
  
      return ffi.string(result).decode("ascii")