الاختلافات في حساب المجموع الاختباري المتداول Adler32 - بيثون

StackOverflow https://stackoverflow.com//questions/9699315

  •  13-12-2019
  •  | 
  •  

سؤال

بحاجة إلى توضيح أثناء النظر في حساب المجموع الاختباري الجاري.

افترض أن لدي بيانات مثل هذه.

data = 'helloworld'

بافتراض أن حجم الكتلة هو 5، أحتاج إلى حساب المجموع الاختباري قيد التشغيل.

>>> zlib.adler32('hello')
103547413
>>> zlib.adler32('ellow')
105316900

وفقًا لوثائق بايثون (إصدار بايثون 2.7.2)

zlib.adler32(data[, value])

"يحسب المجموع الاختباري لبيانات Adler-32.(Adler-32 Checksum يمكن الاعتماد عليها تقريبًا مثل CRC32 ولكن يمكن حسابها بسرعة أكبر.) إذا كانت القيمة موجودة ، فسيتم استخدامها كقيمة انطلاق للفحص ؛وبخلاف ذلك، يتم استخدام قيمة افتراضية ثابتة.هذا يسمح بحساب الفحص قيد التشغيل على تسلسل العديد من المدخلات. "

ولكن عندما أقدم شيئًا كهذا،

>>> zlib.adler32('ellow', zlib.adler32('hello'))
383190072

الإخراج مختلف تماما

لقد حاولت إنشاء وظيفة مخصصة لإنشاء المجموع الاختباري المتداول كما هو محدد في خوارزمية rsync.

def weakchecksum(data):
    a = 1
    b = 0

    for char in data:
        a += (ord(char)) % MOD_VALUE
        b += a % MOD_VALUE



    return (b << 16) | a



def rolling(checksum, removed, added, block_size):
    a = checksum
    b = (a >> 16) & 0xffff
    a &= 0xffff

    a = (a - ord(removed) + ord(added)) % MOD_VALUE
    b = (b - (block_size * ord(removed)) + a) % MOD_VALUE

    return (b << 16) | a

هذه هي القيم التي أحصل عليها من تشغيل هذه الوظائف

Weak for hello: 103547413
Rolling for ellow: 105382436
Weak for ellow: 105316900

كما ترون، هناك بعض الاختلاف الكبير في تنفيذي للمجموع الاختباري المتداول وتطبيق بايثون، من حيث القيمة.

أين أخطئ في حساب المجموع الاختباري المتداول؟هل أستخدم خاصية التدحرج لوظيفة python's adler32 بشكل صحيح؟

هل كانت مفيدة؟

المحلول

ال adler32() الوظيفة لا توفر "المتداول".تستخدم الوثائق بشكل صحيح كلمة "التشغيل" (وليس "المتداول")، وهو ما يعني ببساطة أنه يمكن حساب adler32 في قطع بدلاً من الكل مرة واحدة.تحتاج إلى كتابة التعليمات البرمجية الخاصة بك لحساب قيمة adler32 "المتداولة"، والتي ستكون adler32 لنافذة منزلقة فوق البيانات.

نصائح أخرى

في طريقتك "المتداول"،

giveacodicetagpre. يجب أن تكون

giveacodicetagpre.

وفقا لشرح adler32 خوارزمية في ويكيبيديا، يمكننا أن نرى:

giveacodicetagpre.

عندما نتدحرج المجموع الاختباري، سيكون لدينا المعادلات:

giveacodicetagpre.

بالمناسبة، صحيحة DEF () الخاص بك () الخاص بك، على الأقل لبثون حيث توجد علامة على نتيجة modulo علامة المقسوم.قد لا تعمل بلغات أخرى، حيثما على سبيل المثال في C إشارة نتيجة٪ هي إما علامة توزيع الأرباح أو قيد التنفيذ.

يمكنك جعل خوارزمية أكبر بكفاءة أكبر من خلال النظر إلى مدى اعتبارا من modulo 65521 يمكنك الحصول عليها في كل خطوة، وإما استبدال النسبة المئوية مع IF وإضافات أو طروقات من 65521، أو استخدام أنواع بيانات كبيرة بما يكفي للسماح لها بالرحيلبينما ومعرفة مدى نادرا ما يمكنك الابتعاد مع٪ على المبالغ لتجنب التغلب عليها.مرة أخرى، كن حذرا مع٪ على الأرباح السلبية.

هنا هي وظيفة العمل.يرجى ملاحظة الخطوة التي يتم احتساب mod.

giveacodicetagpre.

أعتقد أنك قد احسبت قيمة adler32 في الاختبار الخاص بك:

giveacodicetagpre.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top