هش JSON ممکن است با تغییرِ فاصله یا ترتیبِ کلیدها عوض شود، حتی وقتی دادهٔ decodeشده یکسان است. پیش از مقایسه باید بگوییم هویتِ دقیقِ فایل را میخواهیم یا نمای قطعیِ داده طبقِ یک قراردادِ مشخص. تمرین این صفحه سه متنِ اصیل را با هشِ خام و یک profile محدود مقایسه میکند. این serializer را پیادهسازیِ کاملِ JCS یا ابزارِ امضای سرویس معرفی نمیکنیم.
دو پرسش متفاوت دربارهٔ برابری
هشِ بایتِ خام میپرسد آیا همین توالیِ دقیقِ بایت تغییر کرده است. در این پرسش، فاصله، newline، escape و ترتیبِ کلید هم بخشی از فایلاند. در مقابل، profileِ این تمرین ابتدا داده را با قواعدِ محدود میخواند و بعد با انتخابهای ثابت serialize میکند؛ سؤالِ دوم به همان قراردادِ تولیدِ بایت وابسته است.
هیچیک از این دو هش، بهتنهایی مرجعِ قابلاعتماد یا اصالتِ ناشر نمیسازند. اگر فایل و هشِ مرجع هر دو از منبعِ نامعتبر آمده باشند، برابریِ آنها امنیت یا مالکیت را اثبات نمیکند. همچنین دو جملهٔ هممعنا میتوانند رشتههای متفاوت باشند؛ profileِ حاضر دربارهٔ معنای زبان تصمیم نمیگیرد.
نام و حدودِ profile را صریح نگه داریم
نامِ قراردادِ آموزشی authored-ascii-key-no-number-v1 است. فقط object با کلیدهای ASCIIِغیرعددیِ تعریفشده، آرایه، رشتهٔ Unicodeِمعتبر، bool و null میپذیرد. همهٔ مقدارهای عددی بیرونِ این زیرمجموعهاند. این انتخاب برای کنارگذاشتنِ پیچیدگیِ serializationِعدد است؛ نمیگوید JSON عمومی نباید عدد داشته باشد.
پس از decode با ردِ کلیدِ تکراری، نوع و حدود بررسی میشوند: ورودی تا۴۰۹۶نویسه، عمق تا۴، بودجهٔ۱۰۰گره، ظرف تا۱۰عضو و رشته تا۱۲۸نویسه. lone surrogate پذیرفته نمیشود. نامِ کلیدها نیز از الگوی کوچکِ اعلامی میآیند؛ کلیدِفارسی یا عددنما در این ابزار unsupported است، نه لزوماً JSON نامعتبر در همهٔ کاربردها.
سه فایلِ متفاوت، یک نمای قراردادی
دادهٔ اصیل یک object تودرتو و آرایهای از فارسی، true و null دارد. آن را سه جور مینویسیم: فاصلهٔ معمولی، تورفتگی با escapeِفارسی و متنِ فشرده با ترتیبِ دیگرِ کلیدها. هشِ خامِ هر سه واقعاً متفاوت است. بعد از profile، هر سه بایتِ یکسان میدهند و با رشتهٔ مورد انتظارِ مستقلی که دستی در کد آمده برابر میشوند.
| تغییر در fixture | هشِ خام | بایتِ profile |
|---|---|---|
| فاصله و ترتیبِ کلید | سه نتیجهٔ متفاوت | یک نتیجهٔ برابر |
| تغییرِ واقعیِ مقدار | هویتِ تازه | نتیجهٔ متفاوت |
| تغییرِ ترتیبِ آرایه | هویتِ تازه | نتیجهٔ متفاوت |
چهار جایگشتِ کلیدهای سطحِ بالا و objectِداخلی هم اجرا میشوند. یک fixtureِ جدا، objectهای داخلِ آرایه را با ترتیبِ کلیدِ متفاوت میسازد و بایتِ مورد انتظارِ مستقل دارد. مرتبسازی فقط روی کلیدهای object است؛ عناصرِ آرایه جابهجا نمیشوند.
رشته را بیاعلان نرمال نکنیم
دو صورتِ é و e بهعلاوهٔ علامتِ ترکیبی در آزمایشِ جدا، بایتِ profile متفاوت میدهند. NFC یا NFKC در این مسیر اجرا نمیشود. اگر بخواهیم تمایزِ codepoint را حذف کنیم، معنایِ قرارداد عوض میشود و باید نسخه و هدفِ دیگری داشته باشد؛ این کار یک جزئیاتِ پنهانِ هشگیری نیست.
هفت ورودیِ خارجِ دامنه واقعاً رد میشوند: عددِ صحیح، اعشاری، NaN، کلیدِ تکراری، lone surrogate، کلیدِ عددنما و کلیدِ غیرASCII. این کنترلها جلوی تفسیرِ مبهمِ همین profile را میگیرند، اما نمایندگیِ داده، صحتِ پاسخِ مدل یا مجوزِ استفاده را تأیید نمیکنند.
چرا sort_keys را JCS کامل نمینامیم؟
RFC8785 یک سندِ Informational با قواعدِ مشخصِ JCS است. مرتبسازیِ کلیدها طبقِ آن بر واحدهای UTF-16 انجام میشود و serializationِعدد به قواعدِ ECMAScript وابسته است. json.dumps با sort_keys=True را بدون اجرایِ همهٔ آن قواعد، به نامِ انطباقِ کاملِ RFC گزارش نمیکنیم. محدودکردنِ کلیدها و حذفِ عدد در تمرین، ادعای پیادهسازیِ بقیهٔ استاندارد را ایجاد نمیکند.
نسخهٔ واقعیِ اجرا Python۳٫۱۲٫۱۴ است. همهٔ متنها و هشها در حافظه ساخته شدهاند؛ هیچ کلیدِ امضا، webhook، فایلِ مشتری یا سرویسِ بیرونی استفاده نشده است. profile، ابزارِ کوچکِ مقایسه است و جای قراردادِ سرویسِ دیگر را نمیگیرد.
بدنهٔ امضاشده را تغییر ندهیم
اگر امضای یک ارائهدهنده روی بایتهای خامِ دریافتشده تعریف شده، پیش از بررسیِ همان امضا نباید بدنه را با profileِ خودمان بازنویسی کنیم. راهنمای امضای وبهوک این مرز را توضیح میدهد. مانفیست و هشِ فایل نیز دقیقاً هویتِ بایتِ مرجع را بررسی میکند؛ هدفِ آن با نمای قراردادیِ این صفحه فرق دارد.
برای ادامه در مبانی هوش مصنوعی، نام و نسخهٔ قراردادِ fingerprint را همراهِ داده ثبت کنید. از این تمرین وجودِ امضای JSON، ابزارِ canonicalization یا سیاستِ کشِ خاص در محصول اپرا نتیجه نمیشود؛ ارزشِ آن روشنکردنِ این سؤال است که «برابر» در بررسیِ ما دقیقاً به چه چیزی اشاره دارد.
فایل تمرین و منبع
کد کامل تمرینِ محلی و کنترلهای آن · نمونههای اصیل و نتیجهٔ اجرای واقعیِ همین کد
منابع در 2026-11-04 خوانده شدند؛ این تاریخ، تاریخ انتشار منبع نیست. مثالها و فایلهای این راهنما آموزشی و ساختهٔ تحریریهاند.