Nie szukałem kodu źródłowego hfs.util i prawdopodobnie jest już za późno, aby był dla ciebie przydatny, ale myślę, że mogę coś wnieść.
Identyfikatory UUID używane dla woluminów HFS + wydają się być wszystkimi wariantami objętymi specyfikacją UUID i mają typ wersji 3, tj. Przestrzeń nazw i nazwa konwertowana na UUID przez MD5 (zobacz szczegóły na wikipedii ).
Wydaje się prawdopodobne, że rzeczywisty identyfikator dysku (zastępujący nazwę w specyfikacji) to zaledwie 64 bity, przekonwertowany na 128-bitowy identyfikator UUID zgodnie ze specyfikacją, poprzedzając identyfikator UUID dowolnej przestrzeni nazw, której Apple używa dla identyfikatorów woluminów, a następnie stosując skrót MD5.
Nie dotyczy to wartości elementów komputera, aktualnego czasu itp. Są one używane w przypadku innych rodzajów identyfikatorów UUID. Wymaga to jednak UUID „przestrzeni nazw” (w celu zidentyfikowania faktu, że „nazywamy” wolumin dysku), a następnie „nazwy” (faktyczny identyfikator dysku).
Jedną z rzeczy, które tak myślę, jest nie tylko stwierdzenie @ chriv, że kod wydaje się używać tylko 64 bitów, ale także sposób, w jaki identyfikatory UUID są obsługiwane przez „tajne” narzędzie dostarczane z SuperDuper!
SuperDuper! narzędzie do tworzenia kopii zapasowych dla systemu Mac OS X ma „ukryte” narzędzie wiersza poleceń, które pozwala pobrać i ustawić identyfikator UUID woluminu. Ale zarówno pobiera, jak i ustawia jako sekwencję 64 bitów (wyrażonych w postaci szesnastkowej). I wygląda na to, że te bity są zupełnie inne niż rzeczywiste wartości zgłaszane przez narzędzia dyskowe Apple.
Aby uzyskać więcej informacji zobacz:
http://www.shirt-pocket.com/forums/archive/index.php/t-1186.html
http://www.shirt-pocket.com/forums/archive/index.php/t-6173.html
Uwaga: przeczytaj te dyskusje dotyczące wsparcia przez cały czas, ponieważ wydaje się, że istnieją pewne problemy, na przykład czasami konieczne ponowne uruchomienie.
Aktualizacja
Spojrzałem na źródła Apple. Potwierdzam to, co napisałem powyżej. Na dysku zapisywany jest 64-bitowy identyfikator woluminu (generowany losowo przez pobranie pierwszych 64 bitów skrótu SHA1 zestawu pseudolosowych bitów danych: czas działania, czas uruchamiania, identyfikator hosta, nazwa hosta, nazwa jądra ciąg, ciąg wersji jądra, średnia wartość obciążenia, statystyki VM i aktualny czas).
W języku UUID w wersji 3 jest to „nazwa”. Zatem na dysku zapisana jest 64-bitowa „nazwa” woluminu, a nie UUID.
UUID 128-bitowy zgłaszany przez narzędzia nie jest zapisywany, jest obliczany za każdym razem, do celów wyświetlania, z „nazwy” i „przestrzeni nazw” (przestrzeń nazw jest stała i jest to stała kFSUUIDNamespaceSHA1, do której OP musiał ręcznie dodać źródło, ponieważ brakuje nagłówka, który go zawiera: reprezentuje „przestrzeń nazw” dla „nazw woluminów”, które są 64-bitowymi rzeczami zapisanymi na woluminach w celu ich identyfikacji).
Przejście z „nazwy” na UUID jest łatwe (w zasadzie stosuje się standardowy algorytm dla UUID wersji 3), ale w zasadzie nie można wrócić z UUID do „nazwy”. Innymi słowy, odpowiedź na OP jest możliwa: jeśli znasz „nazwę” woluminu (na przykład, jeśli chcesz przywrócić kopię zapasową na nowy dysk ORAZ zapisałeś jej nazwę i dane) , ale nie, jeśli znasz tylko UUID. Prawidłowe ustawienie nazwy spowoduje oczekiwany UUID, ale potrzebujesz nazwy i nie możesz jej obliczyć na podstawie UUID.
Uwagi na temat kodu Apple (przeczytaj je i spójrz na kod, a wszystko stanie się jasne):
Jak napisałem, wszystko na dysku to „nazwa”. Identyfikator UUID jest obliczany tylko do wizualizacji przy użyciu algorytmu w wersji 3 (identyfikator UUID dla „nazwy” w „przestrzeni nazw”).
- kFSUUIDNamespaceSHA1 jest stałą „przestrzeni nazw”, jak wyjaśniono powyżej.
- uuid_create_md5_from_name to algorytm UUID wersji 3, który oblicza identyfikator UUID wersji 3, biorąc pod uwagę „przestrzeń nazw” i „nazwę”.
- GenerateVolumeUUID generuje nową losową „nazwę” (uwaga: tylko „nazwa”, a nie UUID, pomimo nazwy funkcji).
Ustawienie i przeniesienie „nazwy” na dysk różni się w zależności od tego, czy wolumin jest aktualnie podłączony. „Nazwa” jest przechowywana w „Informacji o Finderze” woluminu. Pobieranie i ustawianie danych „Finder Info” dla zamontowanego woluminu można wykonać za pomocą getattrlist i setattrlist, ale jeśli wolumin nie jest zamontowany, uciekają się do bezpośredniego dostępu do danych woluminu (w końcu jest to unix, a niezamontowany wolumin jest blokiem urządzenie dostępne jako root jako plik root).
- SetVolumeUUID , SetVolumeUUIDRaw , SetVolumeUUIDAttr , GetVolumeUUID , GetVolumeUUIDRaw , GetVolumeUUIDAttr czytają / zapisują „nazwę” (ponownie, pomimo swojej nazwy, obsługują tylko „nazwę” woluminu, a nie UUID). Funkcje * Raw obsługują bezpośredni dostęp za pośrednictwem „pliku” urządzenia dla niezmontowanych woluminów, te * Attr używają interfejsu API get / setattrlist. Zwykłe sprawdzają, czy wolumin jest zamontowany i wywołują odpowiednią wersję * Raw / * Attr.
Następnie są funkcje „wysokiego poziomu”, które implementują funkcjonalność narzędzia:
- DoGetUUIDKey pobiera „nazwę”, dostosowuje się do endianowości, a następnie oblicza UUID do wyświetlenia.
- DoChangeUUIDKey tworzy nową, losową „nazwę” i zapisuje ją w woluminie.
Najlepsze, co możesz zrobić, to ponownie zakodować tę samą funkcjonalność małego narzędzia wiersza poleceń wbudowanego w SuperDuper Shirt Pocket! (patrz linki, które zamieściłem powyżej).