Whiz Tools

حاسبة خوارزمية لونه

آلة حاسبة لخوارزمية لونه

مقدمة

خوارزمية لونه، المعروفة أيضًا باسم "خوارزمية المودولوس 10" أو "المود 10"، هي صيغة بسيطة للتحقق من الصحة تُستخدم للتحقق من مجموعة متنوعة من أرقام الهوية، مثل أرقام بطاقات الائتمان، وأرقام التأمين الاجتماعي الكندية، وأرقام IMEI، وأرقام معرف مقدمي الخدمات الوطنية في الولايات المتحدة. تتيح لك هذه الآلة الحاسبة التحقق من صحة الأرقام باستخدام خوارزمية لونه وتوليد أرقام صالحة تمر بفحص لونه.

كيفية عمل خوارزمية لونه

تعمل خوارزمية لونه على النحو التالي:

  1. بدءًا من الرقم الأيمن (باستثناء رقم التحقق) والتحرك إلى اليسار، قم بمضاعفة قيمة كل رقم ثاني.
  2. إذا كانت نتيجة عملية المضاعفة هذه أكبر من 9، اطرح 9 من النتيجة.
  3. اجمع جميع الأرقام في التسلسل الناتج.
  4. إذا كان المجموع modulo 10 يساوي 0 (إذا انتهى المجموع بالصفر)، فإن الرقم صالح وفقًا لصيغة لونه؛ وإلا فإنه غير صالح.

إليك تمثيل بصري لخوارزمية لونه:

1. مضاعفة كل رقم ثاني 2. جمع الأرقام (9 للأرقام المضاعفة > 9) 3. حساب مجموع المجموع 4. تحقق مما إذا كان المجموع % 10 == 0

الصيغة

يمكن التعبير عن خوارزمية لونه رياضيًا كما يلي:

دع did_i يكون الرقم ii-th، بدءًا من الرقم الأيمن (باستثناء رقم التحقق) والتحرك إلى اليسار. ثم يتم اختيار رقم التحقق d0d_0 بحيث:

(2d2nmod9+d2n1+2d2n2mod9+d2n3++2d2mod9+d1+d0)mod10=0(2d_{2n} \bmod 9 + d_{2n-1} + 2d_{2n-2} \bmod 9 + d_{2n-3} + \cdots + 2d_2 \bmod 9 + d_1 + d_0) \bmod 10 = 0

حيث mod\bmod هو عملية المودولوس.

حالات الاستخدام

تتمتع خوارزمية لونه بتطبيقات متنوعة في مجالات مختلفة:

  1. التحقق من صحة بطاقة الائتمان: يتم التحقق من معظم أرقام بطاقات الائتمان باستخدام خوارزمية لونه.
  2. أرقام التأمين الاجتماعي الكندية: تُستخدم خوارزمية لونه للتحقق من صحة هذه الأرقام التعريفية.
  3. أرقام IMEI: تتضمن أرقام IMEI للهواتف المحمولة رقم تحقق يتم التحقق منه بواسطة خوارزمية لونه.
  4. أرقام معرف مقدمي الخدمات (NPI): تُستخدم في نظام الرعاية الصحية في الولايات المتحدة، ويتم التحقق من هذه الأرقام باستخدام خوارزمية لونه.
  5. ISBNs: تستخدم بعض أرقام ISBN-10 نوعًا من خوارزمية لونه للتحقق من الصحة.

البدائل

بينما تُستخدم خوارزمية لونه على نطاق واسع، هناك خوارزميات تحقق أخرى لأغراض مختلفة:

  1. خوارزمية دام: خوارزمية أخرى لرقم التحقق التي تكشف عن جميع الأخطاء الفردية وجميع الأخطاء الناتجة عن تبديل الأرقام المجاورة.
  2. خوارزمية فيروهف: خوارزمية تحقق أكثر تعقيدًا تكتشف جميع الأخطاء الفردية ومعظم أخطاء التبديل.
  3. رقم تحقق ISBN-13: يستخدم خوارزمية مختلفة عن ISBN-10، والتي تستند إلى خوارزمية لونه.

التاريخ

تم إنشاء خوارزمية لونه بواسطة هانز بيتر لونه، عالم الكمبيوتر في IBM، في عام 1954. كان لونه رائدًا في مجال علم المعلومات ويُعزى إليه العديد من الابتكارات، بما في ذلك نظام فهرسة KWIC (الكلمات الرئيسية في السياق).

تم تصميم الخوارزمية في الأصل لحماية ضد الأخطاء العرضية، وليس الهجمات الخبيثة. من المهم أن نلاحظ أنه بينما يمكن لخوارزمية لونه اكتشاف العديد من الأخطاء الشائعة، إلا أنها ليست شكلًا آمنًا من التشفير ولا ينبغي الاعتماد عليها لأغراض أمان البيانات.

على الرغم من عمرها، لا تزال خوارزمية لونه مستخدمة على نطاق واسع بسبب بساطتها وفعاليتها في اكتشاف الأخطاء الشائعة في النسخ.

أمثلة على التنفيذ

إليك بعض أمثلة الكود لتنفيذ خوارزمية لونه في لغات برمجة مختلفة:

import random

def luhn_validate(number):
    digits = [int(d) for d in str(number)]
    checksum = 0
    for i in range(len(digits) - 1, -1, -1):
        d = digits[i]
        if (len(digits) - i) % 2 == 0:
            d = d * 2
            if d > 9:
                d -= 9
        checksum += d
    return checksum % 10 == 0

def generate_valid_number(length):
    digits = [random.randint(0, 9) for _ in range(length - 1)]
    checksum = sum(digits[::2]) + sum(sum(divmod(d * 2, 10)) for d in digits[-2::-2])
    check_digit = (10 - (checksum % 10)) % 10
    return int(''.join(map(str, digits + [check_digit])))

## مثال للاستخدام:
print(luhn_validate(4532015112830366))  # صحيح
print(luhn_validate(4532015112830367))  # غير صحيح
print(generate_valid_number(16))  # توليد رقم صالح مكون من 16 رقم
function luhnValidate(number) {
    const digits = number.toString().split('').map(Number);
    let checksum = 0;
    for (let i = digits.length - 1; i >= 0; i--) {
        let d = digits[i];
        if ((digits.length - i) % 2 === 0) {
            d *= 2;
            if (d > 9) d -= 9;
        }
        checksum += d;
    }
    return checksum % 10 === 0;
}

function generateValidNumber(length) {
    const digits = Array.from({length: length - 1}, () => Math.floor(Math.random() * 10));
    const checksum = digits.reduce((sum, digit, index) => {
        if ((length - 1 - index) % 2 === 0) {
            digit *= 2;
            if (digit > 9) digit -= 9;
        }
        return sum + digit;
    }, 0);
    const checkDigit = (10 - (checksum % 10)) % 10;
    return parseInt(digits.join('') + checkDigit);
}

// مثال للاستخدام:
console.log(luhnValidate(4532015112830366));  // صحيح
console.log(luhnValidate(4532015112830367));  // غير صحيح
console.log(generateValidNumber(16));  // توليد رقم صالح مكون من 16 رقم
import java.util.Random;

public class LuhnValidator {
    public static boolean luhnValidate(long number) {
        String digits = String.valueOf(number);
        int checksum = 0;
        boolean isEven = true;
        for (int i = digits.length() - 1; i >= 0; i--) {
            int digit = Character.getNumericValue(digits.charAt(i));
            if (isEven) {
                digit *= 2;
                if (digit > 9) digit -= 9;
            }
            checksum += digit;
            isEven = !isEven;
        }
        return checksum % 10 == 0;
    }

    public static long generateValidNumber(int length) {
        Random random = new Random();
        long[] digits = new long[length - 1];
        for (int i = 0; i < length - 1; i++) {
            digits[i] = random.nextInt(10);
        }
        long checksum = 0;
        for (int i = digits.length - 1; i >= 0; i--) {
            long digit = digits[i];
            if ((length - 1 - i) % 2 == 0) {
                digit *= 2;
                if (digit > 9) digit -= 9;
            }
            checksum += digit;
        }
        long checkDigit = (10 - (checksum % 10)) % 10;
        long result = 0;
        for (long digit : digits) {
            result = result * 10 + digit;
        }
        return result * 10 + checkDigit;
    }

    public static void main(String[] args) {
        System.out.println(luhnValidate(4532015112830366L));  // صحيح
        System.out.println(luhnValidate(4532015112830367L));  // غير صحيح
        System.out.println(generateValidNumber(16));  // توليد رقم صالح مكون من 16 رقم
    }
}

حالات الحافة والاعتبارات الخاصة

عند تنفيذ خوارزمية لونه، ضع في اعتبارك الحالات الخاصة والاعتبارات التالية:

  1. التحقق من صحة الإدخال: تأكد من أن الإدخال هو سلسلة أرقام صالحة. يجب التعامل مع الأحرف غير الرقمية بشكل مناسب (إما إزالتها أو اعتبارها إدخال غير صالح).

  2. الأصفار الرائدة: يجب أن تعمل الخوارزمية بشكل صحيح مع الأرقام التي تحتوي على أصفار رائدة.

  3. الأرقام الكبيرة: كن مستعدًا للتعامل مع أرقام طويلة جدًا قد تتجاوز سعة أنواع الأعداد الصحيحة القياسية في بعض لغات البرمجة.

  4. الإدخال الفارغ: حدد كيفية تعامل تنفيذك مع السلاسل الفارغة أو المدخلات الفارغة.

  5. مجموعات الأحرف غير القياسية: في بعض التطبيقات، قد تواجه أرقامًا تمثل بأحرف خارج النطاق القياسي 0-9. حدد كيفية التعامل مع هذه الحالات.

  6. اعتبارات الأداء: بالنسبة للتطبيقات التي تحتاج إلى التحقق من صحة أعداد كبيرة من المدخلات بسرعة، ضع في اعتبارك تحسين تنفيذ الخوارزمية.

أمثلة عددية

  1. رقم بطاقة ائتمان صالح:

    • الرقم: 4532015112830366
    • تحقق لونه: صالح
  2. رقم بطاقة ائتمان غير صالح:

    • الرقم: 4532015112830367
    • تحقق لونه: غير صالح
  3. رقم تأمين اجتماعي كندي صالح:

    • الرقم: 046 454 286
    • تحقق لونه: صالح
  4. رقم IMEI غير صالح:

    • الرقم: 490154203237518
    • تحقق لونه: غير صالح

حالات الاختبار

للتحقق من تنفيذ خوارزمية لونه، يمكنك استخدام حالات الاختبار التالية:

def test_luhn_algorithm():
    assert luhn_validate(4532015112830366) == True
    assert luhn_validate(4532015112830367) == False
    assert luhn_validate(79927398713) == True
    assert luhn_validate(79927398714) == False
    
    # اختبار الأرقام المولدة
    for _ in range(10):
        assert luhn_validate(generate_valid_number(16)) == True
    
    print("تم اجتياز جميع الاختبارات!")

test_luhn_algorithm()

المراجع

  1. لونه، ه. ب. (1960). "حاسوب للتحقق من الأرقام". براءة اختراع الولايات المتحدة 2,950,048.
  2. غاليان، جوزيف. "رياضيات أرقام الهوية". مجلة الرياضيات الجامعية، المجلد 22، العدد 3، 1991، الصفحات 194–202. JSTOR، www.jstor.org/stable/2686878.
  3. "ISO/IEC 7812-1:2017". المنظمة الدولية للتوحيد القياسي. تم الاسترجاع في 2 أغسطس 2024.
  4. كنوت، دونالد. "فن برمجة الكمبيوتر، المجلد 2: الخوارزميات شبه العددية". أديشن-ويلي، 1997.
Feedback