یک عملکرد کمترین هش کامل برای چهار نام نشان داده شده
 یک تابع هش کامل برای چهار نام نشان داده شده
در علوم رایانه، یک تابع درهم سازی کامل برای مجموعه S تابع هشی است که عناصر مجزا از S را بدون برخورد به مجموعه ای از اعداد صحیح مرتبط می‌کند. از نظر ریاضی، یک تایع یک به یک است.

توابع هش کامل ممکن است برای پیاده‌سازی جدول جستجوی با بدترین زمان دسترسی استفاده شود. یک تابع هش کامل دارای بسیاری از کاربردهای مشابه توابع هش دیگر است، با این برتری که نیازی به بررسی مشکل برخورد ندارد. علاوه بر این، اگر کلیدها داده نباشند، لازم نیست کلیدها در جدول جستجو ذخیره شوند و موجب صرفه جویی در حافظه می‌شوند.

کاربرد
------

با قرار دادن کلیدهای S (یا سایر مقادیر مرتبط) در یک جدول جستجوی فهرست شده (با اندیس) بوسیله خروجی این تابع، یک تابع درهم سازی کامل با مقادیر محدود می‌تواند برای یه عملیات جست و جوی کارآمد استفاده شود. سپس می‌توان با جستجوی سلول کلید مورد نظر در جدول، وجود کلید در S را آزمایش کرد یا مقدار متناظر با آن را جستجو کرد. هرگونه جستجو در بدترین حالت در زمان ثابت صورت می‌گیرد.

ساختن
-----

یک تابع درهم سازی کامل برای یک مجموعه خاص S می‌تواند در زمان ثابت تعیین شود. یا با مقادیر موجود در یک محدوده کوچک، توسط یک الگوریتم تصادفی در تعدادی از عملیات‌ها که (که تعداد آن متناسب با اندازه S می‌باشد) می‌تواند جستجو شود. روش ساختن (Fredman، Komlós و Szemerédi 1984) از یک طرح دو سطحی استفاده می‌کند تا یک مجموعه S از n عنصر به طیف وسیعی از *O*(*n*) شاخص مرتبط (نقشه) کند، و پس از آن هر شاخص به طیف وسیعی از مقادیر هش مرتبط می‌شود. سطح اول ساخت آنها، یک p اول بسیار بزرگ (بزرگتر از اندازه مجموعه ای که S از آن ترسیم شده‌است)، و یک پارامتر k انتخاب می‌کند و هر عنصر x از S را به نمایه (اندیس) خودش مرتبط می‌کند.

{\displaystyle g(x)=(kx{\bmod {p}}){\bmod {n}}.}
اگر k به‌طور تصادفی انتخاب شود، این مرحله به احتمال زیاد دچار برخورد می‌شود، اما تعداد عناصر ni که همزمان به همان اندیس i مرتبط (هش) می‌شوند، احتمالاً اندک است. در سطح دوم ساخت آن به هر اندیس یا شاخص i دامنه *O*(*ni*2) از اعداد صحیح را مرتبط می‌کند. سطح دوم از یک مجموعه دومی شامل توابع ماژولار خطی برای هر اندیس i استفاده می‌کند تا هر عضو x از S را به محدوده*g*(*x*) مرتبط می‌کند.

(Fredman، Komlós و Szemerédi 1984) نشان می‌دهند ، انتخابی برای k وجود دارد طوری که مجموع طول دامنه‌ها برای n مقدار متفاوت (g(x برابر (O(n باشد. همچنین، برای هر مقدار *g*(*x*)، یک تابع ماژولار خطی وجود دارد که زیر مجموعهٔ مطابقت یافته S را با محدوده مربوط به آن مقدار مرتبط می‌کند. چه توابع سطح دوم چه k به ازای هر مقدار *g*(*x*) با انتخاب مقادیر تصادفی تا زمانی که یکی از آنها را بیابد می‌تواند در زمان چند جمله ای کار کند.

این تابع درهم سازی به خودی خود نیاز به فضای حافظه*O*(*n*) دارد تا k و p و همه توابع سطح دوم خطی ماژولار را ذخیره کند. محاسبه مقدار هش یک کلید x داده شده احتمالاً در زمان ثابت با محاسبه *g*(*x*)، جستجو با تابع سطح دوم مرتبط با *g*(*x*) و اجرای این تابع روی انجام می‌شود. یک نسخه اصلاح شده از این طرح دو سطحی با تعداد بیشتری از مقادیر در سطح بالا می‌تواند برای ساختن یک تابع درهم سازی کامل استفاده شود که S را به محدوده کوچکتری با پیچیدگی *n* + *o*(*n*) مرتبط می‌کند (هش می‌کند).

مرزهای پایین حافظه
------------------

استفاده از کلمات حاوی اطلاعات *O*(*n*) برای ذخیره تابع (Fredman، Komlós و Szemerédi 1984) تقریباً بهینه است: هر تابع درهم سازی کامل که در زمان ثابت قابل محاسبه باشد حداقل به تعدادی بیت نیاز دارد که متناسب با اندازه S می‌باشد

برنامه‌های افزودنی
------------------

### در هم سازی کامل پویا

استفاده از یک تابع درهم سازی کامل در شرایطی که یک مجموعه بزرگ که کاملاً پرس و جو شده وجود دارد، S، که به ندرت به روز می‌شود، بهترین گزینه است. این امر به این دلیل است که هرگونه اصلاح مجموعه S ممکن است باعث شود تابع درهم سازی دیگر برای مجموعه تغییر یافته کامل نباشد. روش‌هایی که تابع درهم سازی را به روز می‌کند هر زمان که مجموعه تغییر یابد، به عنوان درهم سازی کامل پویا شناخته می‌شوند، اما این روش‌ها برای پیاده‌سازی نسبتاً پیچیده هستند.

یک تابع درهم سازی کامل حداقلی یک نوع تابع درهم سازی کامل است که n کلید را به n عدد صحیح متوالی - معمولاً اعداد از ۰ تا *n* − ۱ یا از ۱ تا n مرتبط می‌سازد (نقشه یا هش می‌کند). یک روش معمول برای اجرای این موارد: اجازه دهید j و k عناصر برخی از مجموعه S محدود باشند. F یک تابع هش کامل حداقلی است اگر و تنها اگر *F*(*j*) = *F*(*k*) دلالت بر *j* = *k* (تزریق) کند و یک عدد صحیح مانند a وجود داشته باشد طوری که برد F برابر *a*..*a* + |*S*| − ۱ می‌باشد. ثابت شده‌است که برد هدف اصلی یک تابع درهم سازی کامل حداقل به ۱٫۴۴ بیت / کلید نیاز دارد. در صورت اختصاص زمان کافی، بهترین توابع درهم سازی کامل حداقلی شناخته شده در حال حاضر با استفاده کمتر از ۲٫۱ بیت / کلید ارائه شده‌است.

منابع
-----

1. 1 2 3 4  Fredman, Michael L.; Komlós, János; Szemerédi, Endre (1984), "Storing a Sparse Table with *O*(1) Worst Case Access Time", *Journal of the ACM*, **31** (3): 538, doi:10.1145/828.1884, MR 0819156
2. ↑  Fredman, Michael L.; Komlós, János (1984), "On the size of separating systems and families of perfect hash functions", *SIAM Journal on Algebraic and Discrete Methods*, **5** (1): 61–68, doi:10.1137/0605009, MR 0731857.
3. ↑  Dietzfelbinger, Martin; Karlin, Anna; Mehlhorn, Kurt; Meyer auf der Heide, Friedhelm; Rohnert, Hans; Tarjan, Robert E. (1994), "Dynamic perfect hashing: upper and lower bounds", *SIAM Journal on Computing*, **23** (4): 738–761, doi:10.1137/S0097539791194094, MR 1283572.
4. ↑  Belazzougui, Djamal; Botelho, Fabiano C.; Dietzfelbinger, Martin (2009), "Hash, displace, and compress" (PDF), *Algorithms—ESA 2009: 17th Annual European Symposium, Copenhagen, Denmark, September 7-9, 2009, Proceedings* (PDF), Lecture Notes in Computer Science, vol. 5757, Berlin: Springer, pp. 682–693, doi:10.1007/978-3-642-04128-0\_61, MR 2557794.
5. ↑  RecSplit
6. ↑  Belazzougui, Djamal; Botelho, Fabiano C.; Dietzfelbinger, Martin (2009), "Hash, displace, and compress" (PDF), *Algorithms—ESA 2009: 17th Annual European Symposium, Copenhagen, Denmark, September 7-9, 2009, Proceedings* (PDF), Lecture Notes in Computer Science, vol. 5757, Berlin: Springer, pp. 682–693, doi:10.1007/978-3-642-04128-0\_61, MR 2557794.

پانویس
------

* ریچارد جی. سیچلی. *توابع حداقل کمال کاملاً ساده ساخته شده*، ارتباطات ACM، جلد. ۲۳، شماره ۱، ژانویه ۱۹۸۰.
* توماس اچ. کورمن، چارلز ا. لییسرسون، رونالد ال ریوست و کلیفورد اشتاین. *مقدمه ای بر الگوریتم‌ها*، چاپ سوم. MIT Press، ۲۰۰۹. شابک ‎۹۷۸−۰۲۶۲۰۳۳۸۴۸ شابک 978-0262033848. بخش ۱۱٫۵: حشیش کامل، صص ۲۶۷، 277 – ۲۸۲.
* فابیانو سی بوتلو، راسموس پاغ و نیویو زیویانی. "هشی کردن کامل برای برنامه‌های مدیریت داده".
* فابیانو سی بوتلو و نویو زیویانی. "هشیی کامل خارجی برای مجموعه‌های کلید بسیار بزرگ". شانزدهمین کنفرانس ACM در مورد مدیریت اطلاعات و دانش (CIKM07)، لیسبون، پرتغال، نوامبر ۲۰۰۷.
* Djamal Belazzougui، پائولو Boldi , Rasmus Pagh و Sebastiano Vigna. "حداقل یکنواخت کردن کامل یکنواخت: در جستجوی یک جدول مرتب شده با دسترسی O (1)". در مجموعه مقالات بیستمین همایش سالانه ACM-SIAM در ریاضیات گسسته (SODA)، نیویورک، ۲۰۰۹. مطبوعات ACM.
* داگلاس C. اشمیت ، GPERF: یک ژنراتور عملکرد عالی هش، گزارش C ++ , SIGS، جلد. ۱۰، شماره ۱۰، نوامبر / دسامبر ۱۹۹۸.
* Minimal Perfect Hashing توسط باب جنکینز
* gperf یک ژنراتور هش منبع کامل C و C ++ است
* cmph منبع باز است که بسیاری از روش‌های هشی کردن کامل را اجرا می‌کند
* Sux4J متن باز است که هشیی کامل را اجرا می‌کند، از جمله هشدار کامل یکنواخت در جاوا
* MPHSharp متن باز است و بسیاری از روشهای بی‌حس کننده را در C # اعمال می‌کند.
* BBHash یک تابع هش کامل متن باز با منبع ++ C فقط + است