MD5 128 bittir ama neden 32 karakterdir?


95

MD5 ile ilgili bazı dokümanlar okudum, 128 bit olduğunu söyledi, ama neden 32 karakter? Karakterleri hesaplayamıyorum.

  • 1 bayt 8 bittir
  • 1 karakter 1 bayt ise
  • o zaman 128 bit 128/8 = 16 bayttır değil mi?

DÜZENLE:

SHA-1 160 bit üretir, peki kaç karakter vardır?


Referans verdiğiniz dokümanlara bir bağlantı gönderebilir misiniz?
Don Roby

@don: Üzgünüm, öğretim görevlisi notlarım. Ama ba__friend sorumu yanıtladı ve burada test ediyorum: miraclesalad.com/webtools/md5.php ve gerçekten onaltılık karakterler, şimdi benim için çok daha anlamlı. Cevabını en iyi cevap olarak
oylayacağım

Sanırım cevabım bu konuda diğerlerinden daha fazla ayrıntıya giriyor. Bilgisayar programlamada yeniyseniz ve bu soruyu soruyorsanız ve tam bir cevap istiyorsanız
Evan Carroll

9
Aptalca bir soru değil. Bir zamanlar bir baytı kaç tane HEX karakterinin temsil ettiğini bilmiyordunuz.
David Klempfner

Bir ((1 << (n*4))-1).bit_length()
hash'in

Yanıtlar:


107

Onaltılık gösterim olarak 32 karakter, bayt başına 2 karakter demektir.


1
1 bayt, 255 = ff gibi iki basamaklı onaltılık bir sayı ile temsil edilir.
ba__friend

1
yani 1 bayt 2 karakterdir, yani 16 bit 2 karakterdir ve 128/16 = 8'dir. Yani 2 karakterden 8 = 16 karakter gerekli mi? Neden 32?
Koray Tugay

15
Çünkü her onaltılık karakter 4 bit ile temsil edilebilir. Yani 128 bit ise 128/4 = 32 onaltılık karakterdir. Her bir "char", onaltılık gösterim boyutunu 32 * 8 = 256 bit yapacak bir utf8 veya ascii olarak kodlanacak olsa da.
Gaston Sanchez

2
Bu gerçekten kötü bir cevap. Cevabım bununla ilgili ayrıntılara giriyor: stackoverflow.com/a/41618070/124486
Evan Carroll

@KorayTugay "yani 1 bayt 2 karakter, yani 16 bit 2 karakterdir" - 1 bayt! = 16 bit.
David Klempfner

36

Bazı cevapları tek bir yazıda özetlemek istedim.

İlk olarak, MD5 hash değerini bir karakter dizisi olarak değil, onaltılık bir sayı olarak düşünün. Bu nedenle, her rakam bir onaltılık rakamdır (0-15 veya 0-F) ve sekizi değil, dört biti temsil eder.

Bunu daha ileri götürürsek, bir bayt veya sekiz bit iki onaltılık rakamla temsil edilir, örneğin b ' 1111 1111' = 0xFF= 255.

MD5 sağlamalarının uzunluğu 128 bittir ve genellikle 32 onaltılık rakamla temsil edilir.

SHA-1 sağlamalarının uzunluğu 160 bittir ve genellikle 40 onaltılık rakamla temsil edilir.

SHA-2 ailesi için, hash uzunluğunun önceden belirlenmiş bir setten biri olabileceğini düşünüyorum. Dolayısıyla SHA-512, 128 onaltılık rakamla temsil edilebilir.

Yine, bu gönderi sadece önceki cevaplara dayanıyor.


26

Onaltılık bir "karakter" (yarım bayt) "karakter" den farklıdır

Bitlere karşı bayt ve karakterlere karşı net olmak için.

  • 1 bayt 8 bittir (amaçlarımız için)
  • 8 bit 2**8olası kombinasyonları sağlar: 256 kombinasyon

Onaltılık bir karaktere baktığınızda ,

  • 16 kombinasyon [0-9] + [a-f]: tam ürün yelpazesi0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
  • Tek tek heks karakteri bu yüzden 16, 256'dan daha az olmayan bir bayt saklayın.
  • 16 2**4: bu, bir onaltılık karakterin bir baytta (yarım bayt) 4 bit depolayabileceği anlamına gelir.
  • Bu nedenle, iki hex karakter, 8 bitlik 2**8kombinasyonları saklayabilir .
  • Bir bayt, altıgen bir karakter olarak temsil [0-9a-f][0-9a-f]ve bir bayt iki halfs etmektedir (bir yarım bayt çağrı yarım bayt ).

Normal bir tek baytlık karaktere baktığınızda , (burada çok baytlı ve geniş karakterleri tamamen atlayacağız)

  • 16'dan fazla kombinasyon saklayabilir.
  • Karakterin yetenekleri kodlama ile belirlenir . Örneğin, bir baytın tamamını depolayan ISO 8859-1, tüm bunları
  • Tüm bu şeyler tüm 2**8aralığı kaplar.
  • Bir içindeki bir onaltılık karakter md5()tüm bunları saklayabiliyorsa, tüm küçük harfleri, tüm büyük harfleri, tüm noktalama işaretlerini ve ¡°ÀÐàðbeyaz boşluk gibi şeyleri (satırsonu ve sekmeler) ve kontrol karakterlerini (bunu yapabilirsiniz ' t ve çoğu kullanımda değil).

Dolayısıyla, açıkça farklılar ve umarım bu, farklılıkların en iyi şekilde çözümlenmesini sağlar.


1
Bu "Hangi sırayla gerçekte spesifikasyona veya platforma bağımlı" aslında ne anlama geliyor? Bunun biraz daha açıklandığını görmek isterim.
KumarM

@KumarM Bunu sileceğim çünkü bunun sohbetle hiç alakalı olduğunu düşünmüyorum ve kötü bir şekilde yazılmış.
Evan Carroll

22

MD5, onaltılı rakamlar (0-15 / 0-F) verir, bu nedenle her biri dört bittir. 128/4 = 32 karakter.

SHA-1 de onaltılık rakamlar verir (0-15 / 0-F), bu nedenle 160/4 = 40 karakter.

(Matematiksel işlemler olduklarından, çoğu karma işlevin çıktısı genellikle onaltılık rakamlarla temsil edilir.)

Muhtemelen 8 bit olan ASCII metin karakterlerini düşünüyordunuz.


çok teşekkür ederim .. kafamda artık çok daha net bir resim var !!
hash_jr90

not: ascii-charset yazdırılamayan semboller içerir.
Roy Lee

Bunu biraz daha açık bir şekilde
Evan Carroll


2

Bunlar onaltılık rakamlardır, karakter değil. Tek hane = 4 bit.



2

Bir onaltılık rakam = 1 yarım bayt (dört bit)

İki onaltılık basamak = 1 bayt (sekiz bit)

MD5 = 32 onaltılık basamak

32 onaltılık basamak = 16 bayt (32/2)

16 bayt = 128 bit (16 * 8)

Aynı şey SHA-1 için de geçerlidir, ancak 40 onaltılık basamak uzunluğundadır.

Umarım bu yardımcı olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.