4.2.1. اشیاء انبار آدرسدهیشده بر اساس محتوا
دقیقاً مانند اشیاء سیستمفایل، اشیاء انبار نیز میتوانند مبتنی بر آدرسدهی محتوا باشند، مگر اینکه جزو اشیاء انبار مبتنی بر آدرسدهی ورودی باشند.
برای اشیاء انبار، آدرس محتوایی که تولید میکنیم به جای یک هش معمولی، شکل یک مسیر انبار به خود میگیرد. بهطور خاص، طرح آدرسدهی محتوا تضمین میکند که خلاصه (digest) مسیر انبار صرفاً از موارد زیر محاسبه میشود:
- گراف شیء سیستمفایل (شیء ریشه و فرزندان آن، در صورت وجود)
- ارجاعات
- مسیر پوشه انبار
- نام
شیء انبار، و نه هیچ اطلاعات دیگری که خاصیت درونی آن شیء انبار محسوب نشود.
برای مشاهده مشخصات کامل الگوریتمهای درگیر، به مشخصات خلاصههای مسیر انبار مراجعه کنید.
آدرسدهی محتوا برای هر بخش از یک شیء انبار
اشیاء سیستمفایل
با تمام روشهای فعلی پشتیبانیشده برای آدرسدهی محتوای شیء انبار، شیء سیستمفایل همیشه ابتدا مبتنی بر آدرسدهی محتوا میشود و سپس آن هش در محاسبات آدرس محتوای شیء انبار ادغام میگردد.
ارجاعات
ارجاعات به سایر اشیاء انبار
با تمام روشهای فعلی پشتیبانیشده برای آدرسدهی محتوای شیء انبار، به سایر اشیاء از طریق مسیرهای انبار معمولی (کدگذاریشده با رشته) ارجاع داده میشود.
خودارجاعات
با این حال، به خودارجاعات نمیتوان از طریق مسیرشان ارجاع داد، زیرا ما در میانه توصیف نحوه محاسبه آن مسیر هستیم!
روش جایگزین نیازمند یافتن نقطه ثابت تابع هش، یعنی حل یک معادله به شکل زیر است:
digest = hash(..... || digest || ....)که از نظر محاسباتی غیرقابلاجرا است. تا آنجا که میدانیم، این کار معادل پیدا کردن یک تصادم هش (hash collision) است.
در عوض، ما یک مقدار بولی «دارای خودارجاعی» داریم که در نهایت روی هش (digest) تأثیر میگذارد: در تمام روشهای آدرسدهی محتواییِ اشیاء انبار که در حال حاضر پشتیبانی میشوند، هنگام هش کردن دادههای شیء سیستمفایل، هرگونه وقوع مسیر انبار خودِ شیء انبار در دادههای هششده با یک مقدار نشانگر (sentinel value) جایگزین میشود. در عوض از هشهای این جریانهای ورودی تغییریافته استفاده میشود.
هنگام اعتبارسنجی آدرس محتوای یک شیء انبار پس از وقوع، فرآیند بالا دقیقاً همانطور که نوشته شده عمل میکند. با این حال، هنگام ایجاد اولیه شیء انبار، همانطور که در بالا توضیح داده شد، ما مسیر انبار شیء انبار را نمیدانیم. بنابراین، به زبان دقیق، نمیدانیم چه مقداری را قرار است در ورودیهای توابع هش با مقدار نشانگر جایگزین کنیم. چیزی که در عوض اتفاق میافتد این است که شیء انبار موقت --- یعنی دادههایی که میخواهیم از آنها یک شیء انبار بسازیم --- با یک مسیر انبار موقت یا «چرکنویس» جفت میشود (که احتمالاً هنگام ایجاد دادهها انتخاب شده است). به جای شیء انبار نهایی که هنوز آن را نمیشناسیم، آن مسیر انبار موقت است که با مقدار نشانگر جایگزین میشود.
نکته طراحی
این یک ویژگی غیررسمی برای اشیاء انبار آدرسدهیشده با محتوا است که انتخاب مسیر انبار موقت نباید اهمیتی داشته باشد. به عبارت دیگر، اگر یک شیء انبار موقت دقیقاً به همان روش آماده شود اما مسیر انبار موقت متفاوتی برای آن انتخاب شود، نیازی نیست که دادههای موقت یکسان باشند. اما، پس از اینکه مقدار نشانگر به جای مسیر انبار موقتِ هر شیء انبار موقت جایگزین شد، دادههای نهاییِ نرمالشده باید یکسان باشند.
اگر برعکس، دادهها پس از این فرآیند نرمالسازی همچنان متفاوت باشند، ما یک آدرس محتوای متفاوت محاسبه خواهیم کرد. روش آمادهسازی دادههای خودارجاع موقت در این زمینه که نباید انتخاب مسیر انبار موقت را — انتخابی که قرار است دلخواه باشد — به شیء انبار نهایی نشت دهد، در انجام وظیفه خود شکست خورده و قطعی نبوده است.
این ویژگی در این مرحله غیررسمی است، زیرا ما صرفاً در حال توصیف اشیاء انبار هستیم که هیچ مفهوم رسمیای از مبدأ خود ندارند. بدون آن، نمیتوانیم به طور دقیق تعریف کنیم که قطعی نبودن کافی برای این فرآیند به چه معناست. وقتی به سراغ derivationها برویم، قادر خواهیم بود این را به یک ویژگی رسمی تبدیل کنیم — نه خودِ اشیاء انبار آدرسدهیشده با محتوا، بلکه برای derivationهایی که آنها را تولید میکنند.
نام و پوشه انبار
این دو مورد به گونهای بر هش (digest) تأثیر میگذارند که برای محاسبات هش مسیر انبار استاندارد است و مختص آدرسدهی محتوایی نیست. برای جزئیات بیشتر به مشخصات هشهای مسیر انبار مراجعه کنید.
روشهای آدرسدهی محتوایی
به دلایل تاریخی، ما از همه ویژگیها در تمام ترکیبات پشتیبانی نمیکنیم. هر روش آدرسدهی محتوایی که در حال حاضر پشتیبانی میشود، یک روش منفرد برای هش کردن شیء سیستمفایل انتخاب میکند و ممکن است برخی محدودیتها را روی ارجاعات اعمال کند. با این حال، نامها و پوشههای انبار هیچ محدودیتی ندارند.
تخت (Flat) { #method-flat }
این روش از روش تخت (Flat) متناظر برای آدرسدهی محتوایی شیء سیستمفایل استفاده میکند.
ارجاعات پشتیبانی نمیشوند: اشیاء انبار با هش کردن تخت و ارجاعات قابل ایجاد نیستند.
متن (Text) { #method-text }
این همچنین از روش تخت متناظر برای آدرسدهی محتوایی شیء سیستمفایل استفاده میکند.
ارجاعات به سایر انبارهای بستهها پشتیبانی میشوند، اما خودارجاعیها خیر.
این تنها روش آدرسدهی محتوایی انبار است که نام آن با روش متناظر شیء سیستمفایل یکسان نیست. این روش تا حدی مبهم است و عمدتاً برای «فایلهای drv» (درایویشنهای سریالشده بهعنوان اشیاء انبار در فرمت فایل «ATerm» خود) استفاده میشود. در صورت امکان، روش دیگری را ترجیح دهید.
آرشیو نیکس { #method-nix-archive }
این روش از آرشیو نیکس متناظر برای آدرسدهی محتوایی شیء سیستمفایل استفاده میکند.
ارجاعات (چه به سایر انبارهای بستهها و چه خودارجاعیها) تا زمانی که الگوریتم هش SHA-256 باشد پشتیبانی میشوند، اما در غیر این صورت هیچکدام پشتیبانی نمیشوند.
گیت { #method-git }
هشدار
این روش بخشی از ویژگی آزمایشی
git-hashingاست.
این روش از گیت متناظر برای آدرسدهی محتوایی شیء سیستمفایل استفاده میکند.
ارجاعات پشتیبانی نمیشوند.
در حال حاضر فقط SHA-1 پشتیبانی میشود. اگر گیت مبتنی بر SHA-256 رواج بیشتری پیدا کند، این محدودیت بازنگری خواهد شد.
nix.dev/manual/nix/stable/store/store-object/content-address.html