2011-06-02 47 views
4

對不起,我有這種好奇心。爲什麼散列函數像sha1最多隻能使用16個不同的字符(十六進制)?

SHA1使用[a-f0-9]字符爲它的散列函數。我可以知道爲什麼它不使用所有可能的字符,通過使用可能會增加可能的不同散列數的所有字符,從而降低可能碰撞的概率。

如果你不認爲這是一個真正的問題,只是發表評論,我會立即刪除這個問題。

===

如回答說,SHA1不NOT只使用16 chars。正確的事實是:sha1是160位的二進制數據(引用)。我已經添加了這個以防止混淆。

+1

爲什麼downvote?這是一個比其他很多聰明的問題! – BlackBear 2011-06-02 21:51:30

回答

11

你很混淆表示內容

SHA1 是二進制數據的 160位。你可以很容易地代表它:

hex: 0xf1d2d2f924e986ac86fdf7b36c94bcdf32beec15 
decimal: 1380568310619656533693587816107765069100751973397 
binary: 1111000111010010110100101111100100100100111010011000011010101100100001101111110111110111101100110110110010010100101111001101111100110010101111101110110000010101 
base 62: xufK3qj2bZgDrLA0XN0cLv1jZXc 

有沒有什麼神奇的十六進制。這是顯示容易沿着4位邊界破壞的內容的非常常見的機制。

base 62輸出與紅寶石的這一點點生成:

#!/usr/bin/ruby 

def chars_from_hex(s) 
    c = s % 62 
    s = s/62 
    if (s > 0) 
    chars_from_hex(s) 
    end 
    if (c < 10) 
     print c 
    elsif (c < 36) 
     print "abcdefghijklmnopqrstuvwxyz"[c-11].chr() 
    elsif (c < 62) 
     print "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[c-37].chr() 
    else 
     puts "error c", c 
    end 
end 

chars_from_hex(0xf1d2d2f924e986ac86fdf7b36c94bcdf32beec15) 

它使用標準的成語converting from one base to another和對待0-9如0-9,如a-z 10-35,A-Z爲36-61。它可以被平凡地擴展以支持更多數字,包括例如如果需要的話,可以使用[email protected]#$%^&*()-_=+\|[]{},.<>/?;:'"~`。 (或者任何大量的Unicode codepoints。)

@約會拜訪詢問了哈希的ASCII表示具體地說,所以這裏是直接解釋160位散列爲ASCII結果:

ñÒÒù$é¬ý÷³l¼ß2¾ì 

它看起來並不像多,因爲:

此基轉換可以是實際有用的,也解釋; Base64編碼方法使用64(而不是我的62)字符一次表示6位;它需要兩個更多的'數字'字符和一個填充字符。 UUEncoding選擇了一組不同的'數字'。和a fellow stacker had a problem that was easily solved by changing the base of input numbers to output numbers

+0

@ yes123這就是你從二進制轉換爲十進制ascii字符串時所要做的。一個值爲0x5a的字節變成ascii字符串「165」(這是3個字節,值爲0x31,0x36,0x35,沒有信息丟失)。 – nos 2011-06-02 22:06:13

+0

@ yes123顯示的二進制字符串是其ascii表示形式。 – Lyke 2011-06-02 22:08:17

+0

11110 ...你在這個答案中看到'binary:'是它的字符串表示。所有在這裏看到的'hex:decimal:binary'值都是一個字符串,用ascii表示完全相同的sha-1散列 – Lyke 2011-06-02 22:15:55

2

這是錯誤的推理。 sha1使用40 * 4 = 160位。

這恰好是方便的(因此,公約)來格式化爲40位十六進制數字。

您可以使用不同的密碼散列具有較大的散列大小,如果你覺得你是在問題領域,其中的衝突開始是有可能在160位

sha224: 224 bits 
sha256: 256 bits 
md5: 128 bits 
+0

SHA1使用160位(或20個字節,或40個十六進制數字)。 – ysdx 2011-06-02 21:50:52

1

散列算法的輸出是位。以十六進制表示它們只是一種表示。它確實從長度爲0 mod 16的結果中受益,所以在17號基數中的表示將是不方便的。

2

使用十六進制只是允許更容易顯示。 SHA1使用160位。通過十六進制編碼,它可以使摘要很容易地以字符串形式顯示和傳輸。就這樣。

1

SHA-1產生160位散列,這是20個字節,其中有1461501637330902918203684832716283019655932542976個可能的值。因爲這就是哈希算法的定義。

然而,經常是該散列爲可讀文本有用編碼,和方便的方法是簡單地編碼這些20個字節作爲十六進制(這將佔用40個字節)。十六進制字符是[a-f0-9]。

相關問題