2013-02-01 44 views
1

所以我需要生成一個帶有字符串的UUID作爲散列函數的輸入。UTF-8是否對字節順序敏感?

據我瞭解,MS的GUID實現不是可移植的,因此也沒有正確實現RFC 4122。所以我想知道如果我通過傳遞.NET System.Security.Cryptography.SHA1Managed()。ComputeHash(data)函數是一個UTF-8字符串,它基本上陷入了同樣的陷阱。

我相信我很好,因爲維基百科似乎表明字節順序對UTF-8無關緊要,字節順序標記本質上被降爲一個標題來表示字符串是UTF-8。

編輯:注意:我正在嘗試使用UTF-8字符串作爲UUID中使用的哈希的種子。

+2

您無法將任意字節解析爲UTF8。 – SLaks

+0

我正在使用Encoding.UTF8.GetBytes(value); – cb88

+0

@ cb88,試試'byte [] b1 = new byte [] {255,255}; byte [] b2 = Encoding.UTF8.GetBytes(Encoding.UTF8.GetString(b1));'。 'b1'不會等於'b2' – I4V

回答

2

UTF8沒有多個字節順序。
相反,UTF8規範精確定義了用於編碼非ASCII字符的字節順序。

但是,您無法將任意散列解析爲UTF8。

+0

這是否意味着UTF-8可以在不同的系統上以不同的方式定義字節順序,因此這意味着我可能無法始終從種子字符串重新生成正確的UUID?我想應該可以轉換爲ASCII來避免這種情況。 – cb88

+1

@ cb88:否。UTF-8是_standard_。任何定義UTF8不同的系統都是邪惡和破碎的,實際上並沒有使用UTF8。 – SLaks

+0

正如旁註UUID _fields_是每個字段的大端序。 IE整個UUID不會轉換爲大端,而是每個字段單獨。當然,這使得完美的感覺,除非這不是最初發生的事情,因爲它不是直截了當的。 – cb88

4

字節數組沒有endian問題。每個人都同意,無論機器架構如何,陣列中的第一個元素都有最低的地址。 Guid不是一個字節數組,它是一個具有不是字節的字段的結構。並因此對端序是敏感的。

UTF-8編碼的字符串是一個字節[]。 ComputeHash()需要一個字節[]。因此他們對排序不敏感。

+0

但是,在編碼爲UTF-8時,小端和大端機器是否可以將相同的Unicode字符編碼爲不同的字節[]序列,或者實際上是否爲BOM(字節順序標記) ? – binki

+1

與字節順序無關。它有多有用取決於你與誰交談。 Windows程序員會堅持認爲utf-8編碼的文本文件具有BOM,因此他可以將其與傳統代碼頁編碼文件區分開來。一位Unix程序員堅持認爲,這並不是因爲它把他的shell的簽名檢測搞砸了。 –

相關問題