web-dev-qa-db-fra.com

MD5 est 128 bits mais pourquoi est-ce 32 caractères?

J'ai lu quelques docs sur md5, il a dit que ses 128 bits, mais pourquoi est-il 32 caractères? Je ne peux pas calculer les personnages.

  • 1 octet est 8 bits
  • si 1 caractère est 1 octet
  • alors 128 bits est 128/8 = 16 octets non?

MODIFIER:

SHA-1 produit 160 bits, combien y a-t-il de caractères?

75
hash_jr90

Représentation hexadécimale à 32 caractères, soit 2 caractères par octet.

93
ba__friend

Je voulais résumer certaines des réponses en un seul post.

Tout d'abord, ne considérez pas le hachage MD5 comme une chaîne de caractères, mais comme un nombre hexadécimal. Par conséquent, chaque chiffre est un chiffre hexadécimal (0-15 ou 0-F) et représente quatre bits et non huit.

En prenant cela plus loin, un octet ou huit bits sont représentés par deux chiffres hexadécimaux, par ex. b '1111 1111 '= 0xFF = 255.

Les hachages MD5 ont une longueur de 128 bits et sont généralement représentés par 32 chiffres hexadécimaux.

Les hachages SHA-1 ont une longueur de 160 bits et sont généralement représentés par 40 chiffres hexadécimaux.

Pour la famille SHA-2, je pense que la longueur de hachage peut faire partie d'un ensemble prédéterminé. Ainsi, SHA-512 peut être représenté par 128 chiffres hexadécimaux.

Encore une fois, ce post est juste basé sur les réponses précédentes.

27
RepentantFan

Un "caractère" hexadécimal (un quartet) est différent d'un "caractère"

Pour être clair sur les bits vs octet, vs caractères.

  • 1 octet est 8 bits (pour nos besoins)
  • 8 bits fournit 2**8 Combinaisons possibles: 256 combinaisons

Quand vous regardez un caractère hexagonal ,

  • 16 combinaisons de [0-9] + [a-f]: La gamme complète de 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
  • 16 est inférieur à 256, donc un caractère hexadécimal ne ne stocke pas d'octet .
  • 16 est 2**4: Cela signifie qu'un caractère hexadécimal peut stocker 4 bits dans un octet (un demi-octet).
  • Par conséquent, deux caractères hexadécimaux peuvent stocker 8 bits, combinaisons 2**8.
  • Un octet représenté par un caractère hexadécimal est [0-9a-f][0-9a-f] Et représente les deux moitiés d'un octet (nous appelons un demi-octet un petit morcea ).

Lorsque vous regardez un caractère normal à un octet, (nous allons totalement ignorer les caractères multi-octets et les caractères larges ici)

  • Il peut stocker plus de 16 combinaisons.
  • Les capacités du caractère sont déterminées par le encoding. Par exemple, le ISO 8859-1 qui stocke un octet entier, stocke tout cela des choses
  • Tout cela prend toute la gamme 2**8.
  • Si un caractère hexadécimal dans une md5() pouvait stocker tout cela, vous verriez toutes les lettres minuscules, toutes les lettres majuscules, toutes les signes de ponctuation et des choses comme ¡°ÀÐàð, Comme des espaces , et les onglets), et les caractères de contrôle (que vous ne pouvez même pas voir et dont beaucoup ne sont pas utilisés).

Donc, ils sont clairement différents et j'espère que cela fournit la meilleure décomposition des différences.

23
Evan Carroll

MD5 génère des chiffres hexadécimaux (0-15/0-F), ils ont donc quatre bits chacun. 128/4 = 32 caractères.

SHA-1 génère également des chiffres hexadécimaux (0-15/0-F), donc 160/4 = 40 caractères.

(S'agissant d'opérations mathématiques, la sortie de la plupart des fonctions de hachage est généralement représentée par des chiffres hexadécimaux.)

Vous pensiez probablement à ASCII caractères de texte, qui sont 8 bits.

19
Wiseguy

C'est 32 caractères hexadécimaux - 1 caractère hexadécimal correspond à 4 bits.

8
Brett Thomas

Ce sont des chiffres hexadécimaux, pas des caractères. Un chiffre = 4 bits.

2
eaolson

Ce ne sont pas des caractères, ce sont des chiffres hexadécimaux.

2
Jack Edmonds