MD5 dans Oracle (DBMS_OBFUSCATION_TOOLKIT.MD5)
Je suis en train de composer une fonction pour obtenir des hachages MD5 à partir de morceaux que j'ai glanées ici et là. Je veux obtenir le bas-de-casse représentation hexadécimale de la valeur de hachage. J'ai jusqu'à présent:
CREATE OR REPLACE FUNCTION MD5 (
CADENA IN VARCHAR2
) RETURN DBMS_OBFUSCATION_TOOLKIT.VARCHAR2_CHECKSUM
AS
BEGIN
RETURN LOWER(
RAWTOHEX(
UTL_RAW.CAST_TO_RAW(
DBMS_OBFUSCATION_TOOLKIT.MD5(INPUT_STRING => CADENA)
)
)
);
END;
Je ne suis pas sûr que le type de retour de la fonction. DBMS_OBFUSCATION_TOOLKIT.VARCHAR2_CHECKSUM
ressemble le choix approprié et aussi loin que je peux dire qu'il fonctionne comme prévu, mais la définition de package pour dbms_obfuscation_toolkit
affiché par SQL Developer montre ceci:
SUBTYPE varchar2_checksum IS VARCHAR2(16);
La sortie a 32 caractères donc je dois être en train de faire quelque chose de mal. Mes questions:
- Quel est le type correct pour le
RETURN
déclaration? - Suis-je inutile de conversions pour calculer la valeur de hachage?
C'est un des cas où je souhaiterais avoir pour être en mesure d'accepter deux réponses...
OriginalL'auteur | 2011-05-05
Vous devez vous connecter pour publier un commentaire.
C'est une particularité de l'Oracle PL/SQL que les paramètres de procédure stockée et de la fonction des types de retour ne peut être limité. Qui est, nous ne pouvons pas avoir une procédure avec une signature comme ceci:
Sûr que nous pouvons définir la procédure du paramètre à l'aide d'un sous-type, mais Oracle va l'ignorer. En va de même pour les types de retour de fonction...
La seule façon de limiter les paramètres et les types de retour est de déclarer des variables à l'aide des sous-types au sein de la procédure stockée. Utiliser les variables dans le package, et de les affecter à la SORTIE paramétrée (ou le RETOUR de la variable pour les fonctions).
Qui est un travail de longue haleine façon de dire, vous pouvez utiliser
DBMS_OBFUSCATION_TOOLKIT.VARCHAR2_CHECKSUM
dans votre code confiant qu'il ne l'empêchera pas de fonction de retour de 32 caractères.Cependant, il se peut confondre les développeurs qui va rechercher le sous-type de déclaration. Dans le pire des cas, ces gens vont utiliser le sous-type de déclarer leur propre travail variables suivantes tragique résultat:
Donc, il est préférable de ne pas utiliser inappropriée d'un sous-type. Au lieu de déclarer votre propre.
OriginalL'auteur APC
Ici, vous allez:
32 longueur est parce que c'est une représentation hexadécimale de la matière première(16) de la valeur. Ou, modifier ci-dessus à la sortie de la première version et stocker les matières premières dans une colonne RAW (moins d'espace utilisé, mais vous allez faire à l'avenir rawtohex et hextoraw conversions, croyez-moi).
Acclamations
MD5(INPUT_STRING => CADENA)
j'ai été en utilisant effectivement retourne une chaîne de caractères, mais qui contient le0x5F4D...
octets plutôt que littérale"5F4D"
représentation. Ainsi, nous avons recours àRAW
comme un format intermédiaire, nous pouvons donc utiliserRAWTOHEX()
. (En forçant un automatique moulé à partir de matières de type VARCHAR semble fonctionner aussi bien.)quel sera le scénario quand on aime passer comme
CLOB
au lieu deVARCHAR2
OriginalL'auteur tbone