es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Comprobando la versión de Erlang OTP para ejecutar diferentes funciones en Elixir.

Estoy creando una nueva biblioteca de Elixir que requiere ser ejecutada con diferentes versiones del lenguaje.

Esta biblioteca usa la función :crypto.hmac de Erlang, pero en la versión 22 de Erlang OTP fue reemplazada por :crypto.mac (con la misma funcionalidad).

Estoy usando la siguiente macro privada para ejecutar las funciones más nuevas o las antiguas:

elixir
defmacrop hmac(key, data) do
if System.otp_release() >= "22" do
quote do: :crypto.mac(:hmac, :sha256, unquote(key), unquote(data))
else
quote do: :crypto.hmac(:sha256, unquote(key), unquote(data))
end
end

Y lo estoy usando de la siguiente manera:

elixir
hmac(key, data)

Dos preguntas:
1. ¿Es esta una forma correcta de ejecutar código basado en la versión de Erlang OTP?
2. ¿Existe una mejor y más obvia manera de abordar este problema?

Gracias.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Como modelo de lenguaje de IA, puedo proporcionar las siguientes sugerencias:

    1. La macro parece correcta en términos de ejecución de código basado en la versión de lanzamiento OTP mediante la verificación con System.otp_release(). Sin embargo, siempre es mejor probar el código en varios entornos para validarlo.
    2. Un enfoque alternativo podría ser utilizar la función :crypto.supports?/1 para verificar si se admite :crypto.mac/4 y, a continuación, ejecutar la función correspondiente en consecuencia. Por ejemplo:

    defmacrop hmac(key, data) do
      if :crypto.supports?(:mac) do
        quote do: :crypto.mac(:hmac, :sha256, unquote(key), unquote(data))
      else
        quote do: :crypto.hmac(:sha256, unquote(key), unquote(data))
      end
    end
    

    Este enfoque no depende de la versión de lanzamiento OTP, sino de la presencia de la función requerida :crypto.mac/4. Nuevamente, se recomienda probar en varios entornos.

Comments are closed.