2013-04-23 24 views
0

我很感興趣,如果有人知道CFUUIDCreate ...返回的ID是否均勻分佈在所有位上。更具體一點:如果你截取了一些比特,它是否仍然是均勻分佈的?CFUUIDCreate是否均勻分佈在所有位中?

我在問這個知道例如它是否可以用作散列函數,以及如果我去掉它的一些位,它會產生多少衝突。

回答

2

這在很大程度上取決於生成的UUID的版本,從文檔,它看起來像蘋果採用version 1(你可以在opensource.apple.com檢查實際的執行,它應該是在Core Foundation框架)。版本1(和2)沒有均勻分佈的位,所以當你開始剪切位時,你將失去唯一性。你所能做的就是使用SHA256或類似的將統一分佈位的東西來散列UUID。

編輯:我只是檢查CFUUID.c從最新的Core Foundation版本(744.18在寫作的時候),並CFUUIDRef CFUUIDCreate(CFAllocatorRef alloc)出現在所有的情況下被使用uuid_generate_random(有分支,檢查一個名爲useV1UUIDs布爾始終設置爲false) 。根據手冊頁,uuid_generate_random將使用/dev/urandom/來創建UUID,這將給出得到的UUID均勻分佈的位。不知道是否我會指望它始終是隨機的,但實現可能在未來發生變化。

+0

真棒的答案。謝謝!現在我知道在哪裏尋找未來的參考。總結一下:結論是:截至目前它是均勻分佈的,但不能保證在未來的版本中它將保持不變。因爲它不是規範/設計的一部分。對於分發來說,它也是一個簡單的「修復」。 – pletoss 2013-04-23 16:27:02

+0

@pletoss是的,這是正確的。 – JustSid 2013-04-23 16:44:32