خوارزمية لون للتحقق من IMEI: كيف يعمل رقم التحقق
تتحقق خوارزمية لون من أرقام تحقق IMEI بتعقيد O(n) — خط الدفاع الأول ضد أخطاء النسخ. شرح خطوة بخطوة، أمثلة Python وJavaScript، ومتى تكون خوارزمية لون غير كافية.
أنت تبني نظامًا آليًا للتحقق من أرقام IMEI القادمة من منصة إدارة الأجهزة. 10,000 إدخال. بعضها خاطئ بشكل واضح — خطأ إملائي، أو قيمة مؤقتة 000000000000000، أو قيمة منسوخة مع مسافات. كيف تصفي البيانات الرديئة دون استدعاء API لكل إدخال؟ خوارزمية لون. 10 أسطر من الكود، تنفيذ في أجزاء من الثانية، وقد أزلت 95% من أرقام IMEI غير الصالحة قبل أي طلب شبكة.
هذا ليس تمرينًا نظريًا. أي فريق يدير أسطولًا من الأجهزة — منصات MDM، ومشغلو الاتصالات، وأنظمة التأمين، ومنصات السوق الثانوي — يواجه هذه المشكلة بالضبط على نطاق واسع. فهم كيفية عمل خوارزمية لون، وأين تكمن حدودها، هو معرفة أساسية لكل من يبني فوق بيانات IMEI.
ما هي خوارزمية لون؟
خوارزمية لون — المعروفة رسميًا بصيغة لون أو خوارزمية المقياس 10 — ابتكرها هانز بيتر لون، مهندس في شركة IBM. حصل على براءة اختراع لها عام 1954، في الأصل كآلية بسيطة للحماية من أخطاء إدخال البيانات غير المقصودة في أرقام التعريف.
لم تُصمَّم الخوارزمية قط كإجراء أمان تشفيري. كان هدفها محددًا وعمليًا: اكتشاف أكثر أخطاء النسخ البشرية شيوعًا — رقم واحد خاطئ، رقمان متجاوران مُبدَّلان — قبل معالجة الرقم في مراحل لاحقة من العملية.
هذه البساطة العملية جعلتها منتشرة في كل مكان. اليوم، خوارزمية لون مدمجة في:
- أرقام بطاقات الائتمان (Visa وMastercard وAmerican Express) — رقم صالح وفق لون هو شرط مسبق قبل أي محاولة تفويض مصرفي
- أرقام IMEI — مطلوب بموجب توصية ITU-T E.118 ومُطبَّق من قِبل GSMA لكل جهاز محمول يُباع في العالم
- أرقام التأمين الاجتماعي الكندية (SIN)
- بعض أرقام NPI (المعرّف الوطني للمزود) في نظام الرعاية الصحية الأمريكي
- أرقام ICCID على بطاقات SIM
بالنسبة لأرقام IMEI تحديدًا، تشترط مواصفة Device Check الصادرة عن GSMA أن تحمل جميع أرقام IMEI المكونة من 15 رقمًا رقم تحقق Luhn صالحًا كشرط أساسي للتكامل. أي جهاز يفشل في هذا التحقق يكون غير صالح هيكليًا.
الخوارزمية بسيطة حسابيًا: O(n) حيث n هو عدد الأرقام. على الأجهزة الحديثة، يستغرق التحقق من 10,000 رقم IMEI أقل من ميلي ثانية. هذا يجعلها مرشحًا مسبقًا مثاليًا قبل أي استدعاء لـ API خارجية.
خوارزمية لون خطوة بخطوة
لنستعرض الخوارزمية باستخدام رقم IMEI الحقيقي 356938035643809.
يتحلل هذا الرقم كما يلي:
- الحمولة المكونة من 14 رقمًا:
35693803564380 - رقم التحقق:
9
الهدف هو التحقق من صحة رقم التحقق 9.
IMEI: 3 5 6 9 3 8 0 3 5 6 4 3 8 0 9
الموضع: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
الخطوة 1 — مضاعفة كل رقم ثانٍ من اليمين.
ابدأ من الموضع 2 (ما قبل الأخير)، وضاعف كل رقم في موضع زوجي (من اليمين). المواضع الفردية تبقى دون تغيير.
الموضع: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
الرقم: 3 5 6 9 3 8 0 3 5 6 4 3 8 0 9
مضاعفة؟: - x - x - x - x - x - x - x -
النتيجة: 3 10 6 18 3 16 0 6 5 12 4 6 8 0 9
الخطوة 2 — طرح 9 من أي قيمة مضاعفة تتجاوز 9.
يعادل هذا جمع رقمَي النتيجة (مثلًا: 10 تصبح 1+0=1، و18 تصبح 1+8=9).
10 ← 1
18 ← 9
16 ← 7
6 ← 6
12 ← 3
6 ← 6
0 ← 0
المتسلسلة المحدّثة: 3, 1, 6, 9, 3, 7, 0, 6, 5, 3, 4, 6, 8, 0, 9
الخطوة 3 — جمع جميع الأرقام الـ 15.
3+1+6+9+3+7+0+6+5+3+4+6+8+0+9 = 70
الخطوة 4 — التحقق من القابلية للقسمة على 10.
إذا كان المجموع الكلي قابلًا للقسمة على 10، فإن رقم IMEI صالح.
70 mod 10 = 0 → صالح ✓
حساب رقم التحقق (وضع التوليد):
إذا كانت لديك حمولة مكونة من 14 رقمًا وتحتاج إلى حساب رقم التحقق:
مجموع 14 رقمًا (بعد المضاعفة) = 61
رقم التحقق = (10 - (61 mod 10)) mod 10 = (10 - 1) mod 10 = 9
لماذا تكتشف معظم الأخطاء
خطأ في رقم واحد مُبدَّل يغيّر مجموع لون بمقدار غير صفري نادرًا ما يكون مضاعفًا لـ 10. بشكل أدق:
- أي خطأ في رقم واحد يُكتشف دائمًا (معدل اكتشاف 100% لاستبدالات الرقم الواحد)
- استبدال الأرقام المتجاورة (مثل
35تصبح53) يُكتشف في معظم الحالات — الاستثناء الوحيد هو استبدال رقمين متطابقين، وهو لا يحدث أي تغيير - الفساد العشوائي — معدل اكتشاف يبلغ حوالي 90% للأخطاء متعددة الأرقام العشوائية
ما لا تستطيع خوارزمية لون اكتشافه: أي تلاعب مقصود ينتج رقم تحقق صالحًا، أو أي فساد عرضي يحافظ مصادفةً على القابلية للقسمة على 10.
هيكل IMEI — ماذا تعني كل جزء
رقم IMEI هو رقم مكون من 15 خانة محدد بموجب ITU-T E.212 وتديره GSMA. يتكون من ثلاثة حقول متجاورة:
TAC — رمز تخصيص النوع (الأرقام 1-8)
يُعرِّف TAC نوع الجهاز: الشركة المصنعة والطراز. تُخصصه GSMA عند اعتماد الجهاز. رقما TAC الأولان حددا تاريخيًا الجهة المُبلِّغة (مثلًا: 35 كان مخصصًا أصلًا للمجلس البريطاني للموافقات على الاتصالات)، وإن كان تخصيص TAC الحديث قد تطور.
مثال: 35693803 ينتمي إلى طراز Samsung. تتلقى الشركات المصنعة كتلًا من أرقام TAC ويجب عليها تسجيل كل طراز قبل البيع. يمكن للبحث عن TAC أن يُخبرك بالشركة المصنعة واسم الطراز وأحيانًا نطاقات التردد المدعومة.
الرقم التسلسلي — SNR (الأرقام 9-14)
ستة أرقام تُعرِّف الوحدة المحددة بشكل فريد ضمن TAC معين. تخصصها الشركات المصنعة بشكل تسلسلي في معظم خطوط الإنتاج، وإن كان بعضها يستخدم مخططات عشوائية لمنع تعداد الوحدات. هناك ما يصل إلى 1,000,000 رقم تسلسلي ممكن لكل TAC.
رقم التحقق (الرقم 15)
الرقم الأخير، المحسوب عبر خوارزمية لون على الأرقام الـ 14 السابقة. هدفه الوحيد هو اكتشاف الأخطاء. لا يحمل أي معلومات عن الجهاز.
أنماط IMEI غير الصالحة الشائعة
بما يتجاوز الفشل في اختبار Luhn، تُعدّ أرقام IMEI معينة الصالحة هيكليًا غير صالحة دلاليًا بحكم العرف:
| النمط | السبب |
|---|---|
000000000000000 | قيمة مؤقتة — تستخدمها الأجهزة المُعاد ضبطها على إعدادات المصنع والمحاكيات والأجهزة الافتراضية |
111111111111111 | رقم IMEI اختباري — يجتاز لون لكنه ليس جهازًا حقيقيًا أبدًا |
123456789012345 | قيمة اختبارية تسلسلية |
490154203237518 | رقم IMEI اختباري شائع الاستخدام في بيئات التطوير |
| أي قيمة بأقل من 15 رقمًا | مشوه هيكليًا |
يجب على المدقق الفعّال وضع علامة على كل هذه الأنماط إضافةً إلى اختبار لون.
تطبيق التحقق بخوارزمية لون — أمثلة برمجية
Python
def luhn_check(imei: str) -> bool:
digits = [int(d) for d in imei if d.isdigit()]
if len(digits) != 15:
return False
check_sum = 0
for i, d in enumerate(reversed(digits)):
if i % 2 == 1:
d *= 2
if d > 9:
d -= 9
check_sum += d
return check_sum % 10 == 0
الاستخدام:
>>> luhn_check("356938035643809")
True
>>> luhn_check("356938035643800")
False
>>> luhn_check("000000000000000")
False
تحذف الدالة أولًا الأحرف غير الرقمية، مما يتعامل بشكل صحيح مع المدخلات مثل "35 693803 564380 9" (مع مسافات). تُرجع False لأي مدخل لا يحتوي بالضبط على 15 رقمًا بعد الحذف، ثم تُطبّق اختبار لون.
JavaScript
function luhnCheck(imei) {
const digits = imei.replace(/\D/g, '');
if (digits.length !== 15) return false;
let sum = 0;
for (let i = 0; i < 15; i++) {
let d = parseInt(digits[14 - i]);
if (i % 2 === 1) { d *= 2; if (d > 9) d -= 9; }
sum += d;
}
return sum % 10 === 0;
}
خط أنابيب التحقق الجماعي (Python)
def validate_imei_batch(imei_list: list[str]) -> dict:
KNOWN_INVALID = {"000000000000000", "111111111111111", "123456789012345"}
results = {"valid": [], "invalid_format": [], "invalid_luhn": [], "known_bad": []}
for raw in imei_list:
imei = raw.replace(" ", "").replace("-", "")
if not imei.isdigit() or len(imei) != 15:
results["invalid_format"].append(raw)
elif imei in KNOWN_INVALID:
results["known_bad"].append(raw)
elif not luhn_check(imei):
results["invalid_luhn"].append(raw)
else:
results["valid"].append(imei)
return results
للتحقق المرئي من أرقام IMEI فرديًا، استخدم حاسبة IMEI/لون.
التحقق بخوارزمية لون مقابل التحقق الكامل من IMEI
هذا هو التمييز الأهم الذي يجب استيعابه: التحقق بخوارزمية لون هو فحص تنسيق، وليس فحص جهاز.
رقم IMEI الصالح وفق لون يُخبرك أن الرقم مُشكَّل هيكليًا بشكل صحيح. لا يُخبرك بأي شيء عن وجود جهاز حقيقي صُنع بهذا الرقم، أو ما إذا كان الجهاز في قائمة سوداء للشبكة، أو ما إذا كان TAC يتوافق مع شركة مصنعة شرعية.
| نوع الفحص | يكتشف | لا يكتشف |
|---|---|---|
| خوارزمية لون | أخطاء النسخ، التنسيق غير الصالح | جهاز حقيقي أو مزيف، حالة القائمة السوداء |
| بحث TAC | ادعاء طراز خاطئ، TAC غير موجود | القائمة السوداء، قفل التفعيل |
| التحقق من قائمة IMEI السوداء | الأجهزة المُبلَّغ عنها كمسروقة/مفقودة | أرقام IMEI المزيفة غير المُبلَّغ عنها |
| استعلام EIR للشبكة | أرقام IMEI المحجوبة عند ذلك المشغل | أرقام IMEI المحجوبة عند مشغلين آخرين |
لنأخذ بعين الاعتبار سطح الهجوم: يمكن لجهة خبيثة ذات دوافع كافية توليد عدد غير محدود من أرقام IMEI الصالحة وفق لون باختيار TAC صالح وإضافة رقم تسلسلي عشوائي مكوّن من 6 أرقام وحساب رقم التحقق الصحيح. الرقم الناتج سيجتاز اختبار لون في كل مرة. لهذا السبب تُوجَد عمليات التحقق من القائمة السوداء.
التحقق من القائمة السوداء لـ IMEI يتجاوز لون للتحقق من حالة القائمة السوداء للشبكة في قواعد البيانات الحية.
لون فقط (مجاني)
- فوري، بدون اتصال
- يكتشف الأخطاء الإملائية والتنسيق غير الصالح
- 0 سلبيات كاذبة على التنسيق
- لا يتحقق من وجود الجهاز الفعلي
TAC + قائمة سوداء (كامل)
- يتطلب استدعاء API
- يُحقق من الشركة المصنعة والطراز
- يتحقق من حالة قائمة EIR السوداء
- يكتشف الأجهزة المُبلَّغ عنها كمسروقة
متى يكفي لون وحده
التحقق الحصري بخوارزمية لون مناسب عندما:
- تقوم بتنظيف مدخلات المستخدم في الوقت الحقيقي (التحقق من النموذج، التغذية الراجعة للوحة مفاتيح الجوال)
- تُجري تصفية مسبقة جماعية على استيراد كبير قبل استهلاك حصة API
- النظام الخلفي لديه طبقة تحقق خاصة به وأنت فقط تحتاج إلى منع دخول بيانات مشوهة بشكل واضح
متى تحتاج خط الأنابيب الكامل
التحقق الكامل TAC + قائمة سوداء ضروري عندما:
- تشتري أو تقبل جهازًا لإعادة البيع
- تعالج مطالبة تأمين تتعلق بجهاز
- تُفعِّل جهازًا على شبكة
- تُدرج أجهزة في منصة MDM/EMM وتحتاج إلى التحقق من أنها غير مُبلَّغ عنها كمسروقة
البنية الصحيحة دائمًا هي: لون أولًا (مجاني، متزامن، زمن استجابة صفري)، ثم بحث TAC، ثم التحقق من القائمة السوداء — بهذا الترتيب. تُزيل البيانات الرديئة الواضحة بتكلفة صفرية قبل إنفاق استدعاءات API على الباقي.
الخلاصة
خوارزمية لون هي الطبقة الأولى والأسرع في التحقق لأي نظام يعالج أرقام IMEI. إنها ليست آلية أمان — بل هي آلية جودة بيانات. تطبيق واحد للدالة المكونة من 10 أسطر أعلاه، مُنشر عند نقطة الإدخال، يُزيل غالبية الإدخالات غير الصالحة قبل أي طلب شبكة.
المفهوم الهيكلي الذي يجب الاحتفاظ به: لون يتحقق من تنسيق رقم IMEI. بحث TAC يتحقق من الأصل. التحقق من القائمة السوداء يتحقق من الحالة. الطبقات الثلاث تخدم أغراضًا مختلفة ولا يمكن لأي منها الحلول محل الأخريين. في نظام إنتاج يعالج أرقام IMEI على نطاق واسع، الثلاثة ينتمون إلى خط الأنابيب.
أي طبقة تحقق من IMEI اكتشفت أكثر المشكلات في نظامك — فحص تنسيق لون، أم بحث TAC، أم القائمة السوداء؟ شارك تجربتك في التعليقات.
مؤسسة HiCellTek. أكثر من 15 عاماً في الاتصالات — جانب المشغل، جانب المصنع، جانب الميدان. تبني الأداة الميدانية التي يستحقها مهندسو RF.
اطلب عرضاً توضيحياً مخصصاً لـ HiCellTek — تشخيص شبكات 2G/3G/4G/5G على Android.