web-dev-qa-db-fra.com

Meilleur type de données pour stocker le résultat des HASHBYTES ('MD5', ...)

Quel serait le meilleur type de données pour stocker les résultats de la HASHBYTES('MD5', ...)?

Il délivre 16 octets de binaire comme suit: par ex.

0x5CFCD77F9FF836189D2F647EBCEA183E

Je pourrais le stocker dans les types de données suivants:

Chaque ligne aura une valeur (pas de null) et la colonne sera utilisée pour la comparaison avec une colonne similaire dans une autre table.

Quel est le meilleur type de données pour stocker la sortie HASHBYTES à utiliser comme décrit ci-dessus?

Je pensais que puisque les types de données de longueur fixe peuvent parfois être plus efficaces sur les jointures, etc. binary(16) vs varbinary(8000) (la sortie par défaut de HASHBYTES) semble la meilleure, et binary(16) vs une varchar(34) est meilleure car elle utiliserait moins d'espace de stockage.

7
GWR

Selon Livres en ligne :

La sortie est conforme à la norme d'algorithme: 128 bits (16 octets) pour MD2, MD4 et MD5; 160 bits (20 octets) pour SHA et SHA1; 256 bits (32 octets) pour SHA2_256 et 512 bits (64 octets) pour SHA2_512.

Ainsi, malgré le fait que la fonction renvoie techniquement varbinary (8000), vous n'obtiendrez que 16 octets avec MD5. Si vous êtes absolument certain de n'avoir besoin que de MD5, un binaire (16) le fera. Si vous voulez jouer en toute sécurité et autoriser tout algorithme possible (actuel ou futur) que HASHBYTES peut gérer, optez pour varbinary (8000).

Je ne recommanderais certainement pas un type de caractère, car cela impliquera une surcharge de conversion de chaîne et une surcharge de stockage inutile.

8
db2