對不起,我有這種好奇心。爲什麼散列函數像sha1最多隻能使用16個不同的字符(十六進制)?
SHA1使用[a-f0-9]
字符爲它的散列函數。我可以知道爲什麼它不使用所有可能的字符,通過使用可能會增加可能的不同散列數的所有字符,從而降低可能碰撞的概率。
如果你不認爲這是一個真正的問題,只是發表評論,我會立即刪除這個問題。
===
如回答說,SHA1不NOT
只使用16 chars
。正確的事實是:sha1是160位的二進制數據(引用)。我已經添加了這個以防止混淆。
對不起,我有這種好奇心。爲什麼散列函數像sha1最多隻能使用16個不同的字符(十六進制)?
SHA1使用[a-f0-9]
字符爲它的散列函數。我可以知道爲什麼它不使用所有可能的字符,通過使用可能會增加可能的不同散列數的所有字符,從而降低可能碰撞的概率。
如果你不認爲這是一個真正的問題,只是發表評論,我會立即刪除這個問題。
===
如回答說,SHA1不NOT
只使用16 chars
。正確的事實是:sha1是160位的二進制數據(引用)。我已經添加了這個以防止混淆。
你很混淆表示與內容。
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。
@ yes123這就是你從二進制轉換爲十進制ascii字符串時所要做的。一個值爲0x5a的字節變成ascii字符串「165」(這是3個字節,值爲0x31,0x36,0x35,沒有信息丟失)。 – nos 2011-06-02 22:06:13
@ yes123顯示的二進制字符串是其ascii表示形式。 – Lyke 2011-06-02 22:08:17
11110 ...你在這個答案中看到'binary:'是它的字符串表示。所有在這裏看到的'hex:decimal:binary'值都是一個字符串,用ascii表示完全相同的sha-1散列 – Lyke 2011-06-02 22:15:55
這是錯誤的推理。 sha1使用40 * 4 = 160位。
這恰好是方便的(因此,公約)來格式化爲40位十六進制數字。
您可以使用不同的密碼散列具有較大的散列大小,如果你覺得你是在問題領域,其中的衝突開始是有可能在160位
sha224: 224 bits
sha256: 256 bits
md5: 128 bits
SHA1使用160位(或20個字節,或40個十六進制數字)。 – ysdx 2011-06-02 21:50:52
散列算法的輸出是位。以十六進制表示它們只是一種表示。它確實從長度爲0 mod 16的結果中受益,所以在17號基數中的表示將是不方便的。
使用十六進制只是允許更容易顯示。 SHA1使用160位。通過十六進制編碼,它可以使摘要很容易地以字符串形式顯示和傳輸。就這樣。
SHA-1產生160位散列,這是20個字節,其中有1461501637330902918203684832716283019655932542976個可能的值。因爲這就是哈希算法的定義。
然而,經常是該散列爲可讀文本有用編碼,和方便的方法是簡單地編碼這些20個字節作爲十六進制(這將佔用40個字節)。十六進制字符是[a-f0-9]。
爲什麼downvote?這是一個比其他很多聰明的問題! – BlackBear 2011-06-02 21:51:30