CRC32 checksum คำนวณอย่างไร


104

บางทีฉันอาจจะไม่เห็น แต่ CRC32 ดูเหมือนจะซับซ้อนโดยไม่จำเป็นหรืออธิบายไม่เพียงพอในทุกที่ที่ฉันพบบนเว็บ

ฉันเข้าใจว่ามันเป็นส่วนที่เหลือจากการหารเลขคณิตแบบไม่ถือตามค่าของข้อความหารด้วยพหุนาม (ตัวสร้าง) แต่การนำไปใช้จริงทำให้ฉันหนีไป

ฉันได้อ่าน คำแนะนำที่ไม่เจ็บปวดสำหรับอัลกอริทึมการตรวจจับข้อผิดพลาด CRCและฉันต้องบอกว่ามันไม่เจ็บปวด มันเป็นไปตามทฤษฎีที่ค่อนข้างดี แต่ผู้เขียนไม่เคยเข้าใจง่ายๆว่า "นี่มัน" เขาบอกว่าพารามิเตอร์สำหรับอัลกอริทึม CRC32 มาตรฐานคืออะไร แต่เขาละเลยที่จะอธิบายอย่างชัดเจนว่าคุณจะไปถึงมันอย่างไร

ส่วนที่ทำให้ฉันเข้าใจคือเมื่อเขาพูดว่า "นี่ไง" จากนั้นก็พูดว่า "โอ้ยังไงก็ตามมันสามารถย้อนกลับหรือเริ่มต้นด้วยเงื่อนไขเริ่มต้นที่แตกต่างกันได้" และไม่ได้ให้คำตอบที่ชัดเจนว่าวิธีสุดท้ายคืออะไร ของการคำนวณการตรวจสอบ CRC32 จากการเปลี่ยนแปลงทั้งหมดที่เขาเพิ่งเพิ่มเข้าไป

  • มีคำอธิบายที่ง่ายกว่านี้เกี่ยวกับวิธีคำนวณ CRC32 หรือไม่?

ฉันพยายามเขียนโค้ดใน C ว่าตารางถูกสร้างขึ้นอย่างไร:

for (i = 0; i < 256; i++)
{
    temp = i;

    for (j = 0; j < 8; j++)
    {
        if (temp & 1)
        {
            temp >>= 1;
            temp ^= 0xEDB88320;
        }
        else {temp >>= 1;}
    }
    testcrc[i] = temp;
}

แต่ดูเหมือนว่าจะสร้างค่าที่ไม่สอดคล้องกับค่าที่ฉันพบจากที่อื่นบนอินเทอร์เน็ต ฉันทำได้ใช้ค่าที่พบทางออนไลน์ แต่ฉันต้องการเข้าใจว่าค่าเหล่านี้ถูกสร้างขึ้นอย่างไร

ความช่วยเหลือใด ๆ ในการล้างตัวเลขที่สับสนอย่างไม่น่าเชื่อเหล่านี้จะได้รับการชื่นชมมาก


9
รหัสของคุณสำหรับสร้างตาราง CRC32 ดูเหมือนจะถูกต้อง lsbit-first ของคุณ (ย้อนกลับ ) CRC32 พหุนาม0xEDB88320ยังสามารถเขียน msbit แรก ( ปกติ ) 0x04C11DB7ในฐานะ ค่าตารางที่คุณพบจากที่อื่นสร้างขึ้นโดยใช้พหุนาม CRC เดียวกันหรือไม่
jschmier

1
@jschmier สวัสดีฉันรู้สึกเหมือนอยู่ข้างหลังผู้ชายคนนี้ถามคำถาม? stackoverflow.com/questions/62168128/…
bluejayke

หากใครก็ตามที่อยากรู้อยากเห็น "คำแนะนำที่ไม่เจ็บปวดสำหรับอัลกอริทึมการตรวจจับข้อผิดพลาด CRC" ที่ลิงก์ไว้ด้านบน URL ดั้งเดิมนั้นจะถูกซ่อนไว้ แต่ Google พบสำเนาหลายชุดได้อย่างง่ายดายรวมถึงzlib.net/crc_v3.txt
Stéphane

คำตอบ:


120

พหุนามสำหรับ CRC32 คือ:

x 32 + x 26 + x 23 + x 22 + x 16 + x 12 + x 11 + x 10 + x 8 + x 7 + x 5 + x 4 + x 2 + x + 1

หรือในฐานสิบหกและไบนารี:

0x 01 04 C1 1D B7
1 0000 0100 1100 0001 0001 1101 1011 0111

เทอมสูงสุด (x 32 ) มักจะไม่ถูกเขียนอย่างชัดเจนดังนั้นจึงสามารถแทนด้วยเลขฐานสิบหกได้

0x 04 C1 1D B7

อย่าลังเลที่จะนับ 1 และ 0 แต่คุณจะพบว่ามันตรงกับพหุนามที่ไหน 1บิต 0 (หรือบิตแรก) และxเป็นบิต 1 (หรือบิตที่สอง)

ทำไมต้องเป็นพหุนามนี้? เนื่องจากจำเป็นต้องมีพหุนามมาตรฐานที่กำหนดและมาตรฐานถูกกำหนดโดย IEEE 802.3 นอกจากนี้ยังเป็นเรื่องยากมากที่จะค้นหาพหุนามที่ตรวจจับข้อผิดพลาดของบิตต่างๆได้อย่างมีประสิทธิภาพ

คุณสามารถคิดว่า CRC-32 เป็นชุดของ "เลขคณิตไบนารีที่ไม่มีการดำเนินการ" หรือโดยทั่วไปคือ "XOR และการทำงานกะ" สิ่งนี้เรียกในทางเทคนิคว่าเลขคณิตพหุนาม

เพื่อให้เข้าใจได้ดีขึ้นให้นึกถึงการคูณนี้:

(x^3 + x^2 + x^0)(x^3 + x^1 + x^0)
= (x^6 + x^4 + x^3
 + x^5 + x^3 + x^2
 + x^3 + x^1 + x^0)
= x^6 + x^5 + x^4 + 3*x^3 + x^2 + x^1 + x^0

ถ้าเราถือว่า x เป็นฐาน 2 เราจะได้:

x^7 + x^3 + x^2 + x^1 + x^0

ทำไม? เนื่องจาก 3x ^ 3 คือ 11x ^ 11 (แต่เราต้องการเพียง 1 หรือ 0 หลักก่อนเท่านั้น) เราจึงดำเนินการต่อ:

=1x^110 + 1x^101 + 1x^100          + 11x^11 + 1x^10 + 1x^1 + x^0
=1x^110 + 1x^101 + 1x^100 + 1x^100 + 1x^11 + 1x^10 + 1x^1 + x^0
=1x^110 + 1x^101 + 1x^101          + 1x^11 + 1x^10 + 1x^1 + x^0
=1x^110 + 1x^110                   + 1x^11 + 1x^10 + 1x^1 + x^0
=1x^111                            + 1x^11 + 1x^10 + 1x^1 + x^0

แต่นักคณิตศาสตร์เปลี่ยนกฎเพื่อให้เป็น mod 2 ดังนั้นโดยพื้นฐานแล้ว binary polynomial mod 2 ใด ๆ ก็เป็นเพียงการเพิ่มโดยไม่ต้องพกหรือ XOR สมการเดิมของเราจึงมีลักษณะดังนี้:

=( 1x^110 + 1x^101 + 1x^100 + 11x^11 + 1x^10 + 1x^1 + x^0 ) MOD 2
=( 1x^110 + 1x^101 + 1x^100 +  1x^11 + 1x^10 + 1x^1 + x^0 )
= x^6 + x^5 + x^4 + 3*x^3 + x^2 + x^1 + x^0 (or that original number we had)

ฉันรู้ว่านี่เป็นการก้าวกระโดดของความเชื่อ แต่นี่เกินความสามารถของฉันในฐานะโปรแกรมเมอร์สายงาน หากคุณเป็นนักเรียน CS หรือวิศวกรระดับฮาร์ดคอร์ฉันขอท้าให้ทำลายสิ่งนี้ ทุกคนจะได้รับประโยชน์จากการวิเคราะห์นี้

ดังนั้นเพื่อหาตัวอย่างเต็ม:

   Original message                : 1101011011
   Polynomial of (W)idth 4         :      10011
   Message after appending W zeros : 11010110110000

ตอนนี้เราแบ่งข้อความเสริมด้วยโพลีโดยใช้เลขคณิต CRC นี่คือการหารเดียวกันกับก่อนหน้านี้:

            1100001010 = Quotient (nobody cares about the quotient)
       _______________
10011 ) 11010110110000 = Augmented message (1101011011 + 0000)
=Poly   10011,,.,,....
        -----,,.,,....
         10011,.,,....
         10011,.,,....
         -----,.,,....
          00001.,,....
          00000.,,....
          -----.,,....
           00010,,....
           00000,,....
           -----,,....
            00101,....
            00000,....
            -----,....
             01011....
             00000....
             -----....
              10110...
              10011...
              -----...
               01010..
               00000..
               -----..
                10100.
                10011.
                -----.
                 01110
                 00000
                 -----
                  1110 = Remainder = THE CHECKSUM!!!!

การหารจะให้ผลหารซึ่งเราทิ้งไปและส่วนที่เหลือซึ่งเป็นเช็คซัมที่คำนวณได้ สิ่งนี้จะสิ้นสุดการคำนวณ โดยปกติแล้วการตรวจสอบจะถูกผนวกเข้ากับข้อความและผลลัพธ์ที่ส่ง ในกรณีนี้ระบบส่งกำลัง: 11010110111110

ใช้เฉพาะตัวเลข 32 บิตเป็นตัวหารและใช้สตรีมทั้งหมดเป็นเงินปันผล โยนผลหารออกและเก็บส่วนที่เหลือไว้ ลากส่วนที่เหลือที่ท้ายข้อความของคุณและคุณมี CRC32

รีวิวผู้ชายโดยเฉลี่ย:

         QUOTIENT
        ----------
DIVISOR ) DIVIDEND
                 = REMAINDER
  1. ใช้ 32 บิตแรก
  2. กะบิต
  3. ถ้า 32 บิตน้อยกว่า DIVISOR ไปที่ขั้นตอนที่ 2
  4. XOR 32 บิตโดย DIVISOR ไปที่ขั้นตอนที่ 2

(โปรดทราบว่าสตรีมจะต้องแบ่งได้ 32 บิตหรือควรมีการบุนวมตัวอย่างเช่นสตรีม ANSI 8 บิตจะต้องมีการบุนวมนอกจากนี้ในตอนท้ายของสตรีมการแบ่งจะหยุดลงด้วย)


14
+1 สำหรับ "Average Guy Review" ในตอนท้าย - อาจพิจารณาเลื่อนไปทางขวาบน - TL ประเภทหนึ่ง DR: P
aaronsnoswell

4
@abstractnature จำไว้ว่าเรากำลังหารพหุนามไม่ใช่แค่เลขฐานสอง เราไม่สามารถทำการลบ "ปกติ" ได้เนื่องจากเราไม่สามารถ "ยืม" $ x ^ n $ จาก $ x ^ {n + 1} $; เป็นคนละประเภทกัน นอกจากนี้เนื่องจากบิตเป็นเพียง 0 หรือ 1 ค่า -1 จะเป็นอย่างไร จริงๆแล้วเรากำลังทำงานในวงแหวนของพหุนามที่มีสัมประสิทธิ์ในฟิลด์ $ Z / 2Z $ ซึ่งมีเพียงสององค์ประกอบคือ 0 และ 1 และโดยที่ $ 1 + 1 = 0 $ ด้วยการวางกาแฟไว้ในสนามจากนั้นพหุนามจะสร้างสิ่งที่เรียกว่าโดเมนยุคลิดซึ่งโดยพื้นฐานแล้วจะช่วยให้สิ่งที่เราพยายามทำนั้นมีความชัดเจนตั้งแต่แรก
calavicci

6
เพียงเพื่อชี้แจงพหุนามที่แท้จริงคือ 100000100110000010001110110110111 = 0x104C11DB7 MSB มีความหมายโดยนัย แต่ยังควรนำมาพิจารณาในการนำไปใช้งาน เนื่องจากมันจะถูกตั้งค่าเสมอเนื่องจากพหุนามต้องมีความยาว 33 บิต (ดังนั้นส่วนที่เหลืออาจมีความยาว 32 บิต) บางคนไม่ใส่ MSB
Felipe T.

2
x^6 + x^5 + x^4 + 3*x^3 + x^2 + x^1 + x^0 ... If we assume x is base 2 then we get: x^7 + x^3 + x^2 + x^1 + x^0. นี่ไม่ใช่วิธีการทำงานของคณิตศาสตร์ ค่าสัมประสิทธิ์ของพหุนามคือ mod (2) หรือ GF (2) ค่า x จะถูกปล่อยให้อยู่คนเดียวส่งผลให้ x ^ 6 + x ^ 5 + x ^ 4 + x ^ 3 + x ^ 2 + x ^ 1 + x ^ 0 (ตั้งแต่ 3 mod (2) = 1) Tack the remainder on the end of your message- ในทางเทคนิคแล้วเศษที่เหลือจะถูกลบออกจาก 0 บิตที่ต่อท้ายข้อความ แต่เนื่องจากนี่เป็นคณิตศาสตร์ mod (2) ทั้งการบวกและการลบจึงเหมือนกับ XOR และศูนย์บิต XOR กับเศษที่เหลือจะเหมือนกัน เป็นส่วนที่เหลือ
rcgldr

2
@MarcusJ - Why did you append four 0s though?- อัลกอริทึมของซอฟต์แวร์ในการคำนวณ crc ผนวก 0s ได้อย่างมีประสิทธิภาพแม้ว่าจะไม่ชัดเจนก็ตาม หากแสดงการคำนวณ CRC โดยใช้การหารแบบยาวก็จะต้องมีการต่อท้าย 0 เพื่อให้ตัวอย่างการหารปรากฏอย่างถูกต้อง
rcgldr

11

สำหรับ IEEE802.3, CRC-32 คิดว่าข้อความทั้งหมดเป็นสตรีมบิตอนุกรมต่อท้าย 32 ศูนย์ที่ท้ายข้อความ จากนั้นคุณต้องย้อนกลับบิตของทุกไบต์ของข้อความและทำ 1 เติมเต็ม 32 บิตแรก ตอนนี้หารด้วยพหุนาม CRC-32, 0x104C11DB7 สุดท้ายคุณต้อง 1 เติมเต็มส่วนที่เหลือ 32 บิตของการหารนี้บิตย้อนกลับแต่ละ 4 ไบต์ของส่วนที่เหลือ ซึ่งจะกลายเป็น CRC 32 บิตที่ต่อท้ายข้อความ

เหตุผลสำหรับขั้นตอนแปลก ๆ นี้คือการใช้งานอีเทอร์เน็ตครั้งแรกจะทำให้ข้อความเป็นอนุกรมทีละไบต์และส่งบิตที่มีนัยสำคัญน้อยที่สุดของทุกไบต์ก่อน จากนั้นสตรีมบิตอนุกรมจะผ่านการคำนวณทะเบียนกะ CRC-32 แบบอนุกรมซึ่งได้รับการเติมเต็มและส่งออกทางสายหลังจากที่ข้อความเสร็จสมบูรณ์ เหตุผลในการเติมเต็ม 32 บิตแรกของข้อความเพื่อที่คุณจะไม่ได้รับ CRC เป็นศูนย์ทั้งหมดแม้ว่าข้อความจะเป็นเลขศูนย์ทั้งหมดก็ตาม


2
นี่เป็นคำตอบที่ดีที่สุดที่นี่แม้ว่าฉันจะแทนที่ 'bit-reverse แต่ละ 4 ไบต์' ด้วย 'bit-reverse 4 ไบต์โดยถือว่าเป็นเอนทิตีเดียว' เช่น 'abcdefgh ijklmnop qrstuvwx yzABCDEF' เป็น 'FEDCBAzy xwvutsrq ponmlkji hgfedcba '. ดูเพิ่มเติม: CRC-32 กัญชากวดวิชา - AutoHotkey ชุมชน
vafylec

1
สวัสดี "ข้อความ" อะไรที่แน่นอนคุณย้อนกลับด้วย? stackoverflow.com/questions/62168128/…
bluejayke

10

CRC ค่อนข้างง่าย คุณนำพหุนามที่แสดงเป็นบิตและข้อมูลและแบ่งพหุนามลงในข้อมูล (หรือคุณแทนข้อมูลเป็นพหุนามและทำสิ่งเดียวกัน) ส่วนที่เหลือซึ่งอยู่ระหว่าง 0 และพหุนามคือ CRC รหัสของคุณยากที่จะเข้าใจส่วนหนึ่งเป็นเพราะยังไม่สมบูรณ์: ไม่ได้ประกาศ temp และ testcrc ดังนั้นจึงไม่ชัดเจนว่ามีการจัดทำดัชนีอะไรและข้อมูลกำลังทำงานผ่านอัลกอริทึมเท่าใด

วิธีทำความเข้าใจ CRCs คือการพยายามคำนวณบางส่วนโดยใช้ข้อมูลสั้น ๆ (16 บิตหรือมากกว่านั้น) ด้วยพหุนามสั้น ๆ - 4 บิต หากคุณฝึกฝนวิธีนี้คุณจะเข้าใจอย่างแท้จริงว่าคุณจะเขียนโค้ดได้อย่างไร

หากคุณทำบ่อยๆ CRC จะคำนวณในซอฟต์แวร์ได้ค่อนข้างช้า การคำนวณฮาร์ดแวร์มีประสิทธิภาพมากกว่าและต้องใช้เพียงไม่กี่ประตู


1
สำหรับ CRC32 หรือ CRC32b เราได้รับความหมายของการชนกันของแฮชสำหรับสองสายที่แตกต่างกันหรือไม่เราได้รับ CRC เดียวกันหรือไม่
indianwebdevil

1
สวัสดีฉันสับสนนิดหน่อยว่าคุณหมายถึงอะไร "หารพหุนามเป็นข้อมูล"? stackoverflow.com/questions/62168128/… X ในพหุนาม represnted โดยอะไร? ฉันใช้ oter bytes จาก chunk หรือไม่?
bluejayke

7

นอกเหนือจากการตรวจสอบความซ้ำซ้อนของวงจรวิกิพีเดียและการคำนวณบทความCRCแล้วฉันยังพบบทความชื่อReversing CRC - Theory and Practice *เพื่อเป็นข้อมูลอ้างอิงที่ดี

โดยพื้นฐานแล้วมีสามวิธีในการคำนวณ CRC: วิธีพีชคณิตวิธีเชิงบิตและแนวทางที่ขับเคลื่อนด้วยตาราง ในการย้อนกลับ CRC - ทฤษฎีและการปฏิบัติ *อัลกอริทึม / วิธีการทั้งสามนี้อธิบายในทางทฤษฎีพร้อมกับในภาคผนวกโดยการใช้งาน CRC32 ในภาษาโปรแกรม C

* ลิงก์ PDF
ย้อนกลับ CRC - ทฤษฎีและการปฏิบัติ
HU Berlin Public Report
SAR-PR-2006-05
พฤษภาคม 2549
Authors:
Martin Stigge, Henryk Plötz, Wolf Müller, Jens-Peter Redlich


สวัสดีคุณช่วยอธิบายให้ละเอียดหน่อยได้ไหม
bluejayke

7

ฉันใช้เวลาสักพักในการพยายามหาคำตอบสำหรับคำถามนี้และในที่สุดฉันก็ได้เผยแพร่บทช่วยสอนเกี่ยวกับ CRC-32 ในวันนี้: บทช่วยสอนแฮช CRC-32 - ชุมชน AutoHotkey

ในตัวอย่างนี้ฉันสาธิตวิธีคำนวณแฮช CRC-32 สำหรับสตริง ASCII 'abc':

calculate the CRC-32 hash for the ASCII string 'abc':

inputs:
dividend: binary for 'abc': 0b011000010110001001100011 = 0x616263
polynomial: 0b100000100110000010001110110110111 = 0x104C11DB7

011000010110001001100011
reverse bits in each byte:
100001100100011011000110
append 32 0 bits:
10000110010001101100011000000000000000000000000000000000
XOR the first 4 bytes with 0xFFFFFFFF:
01111001101110010011100111111111000000000000000000000000

'CRC division':
01111001101110010011100111111111000000000000000000000000
 100000100110000010001110110110111
 ---------------------------------
  111000100010010111111010010010110
  100000100110000010001110110110111
  ---------------------------------
   110000001000101011101001001000010
   100000100110000010001110110110111
   ---------------------------------
    100001011101010011001111111101010
    100000100110000010001110110110111
    ---------------------------------
         111101101000100000100101110100000
         100000100110000010001110110110111
         ---------------------------------
          111010011101000101010110000101110
          100000100110000010001110110110111
          ---------------------------------
           110101110110001110110001100110010
           100000100110000010001110110110111
           ---------------------------------
            101010100000011001111110100001010
            100000100110000010001110110110111
            ---------------------------------
              101000011001101111000001011110100
              100000100110000010001110110110111
              ---------------------------------
                100011111110110100111110100001100
                100000100110000010001110110110111
                ---------------------------------
                    110110001101101100000101110110000
                    100000100110000010001110110110111
                    ---------------------------------
                     101101010111011100010110000001110
                     100000100110000010001110110110111
                     ---------------------------------
                       110111000101111001100011011100100
                       100000100110000010001110110110111
                       ---------------------------------
                        10111100011111011101101101010011

remainder: 0b10111100011111011101101101010011 = 0xBC7DDB53
XOR the remainder with 0xFFFFFFFF:
0b01000011100000100010010010101100 = 0x438224AC
reverse bits:
0b00110101001001000100000111000010 = 0x352441C2

thus the CRC-32 hash for the ASCII string 'abc' is 0x352441C2

1
หากคุณต้องการความเร็วที่มากขึ้นมีวิธีการหนึ่งที่วิศวกรบางคนของ Intel ใช้เมื่อประมาณปี 2549 โดยใช้ความกว้างบัสข้อมูลของเครื่อง 4 หรือ 8 ไบต์พร้อมกัน เอกสารวิชาการ: static.aminer.org/pdf/PDF/000/432/446/… Project on Sourceforge: sourceforge.net/projects/slicing-by-8 General crc page: create.stephan-brumme.com/crc32
Alan Corey

1
สวัสดีขอบคุณดูดี แต่คุณจะได้ค่าพหุนามได้อย่างไร? X แสดงถึงอะไรกันแน่? และเมื่อมันบอกว่า x ^ 32 นั่นคือ x ยกกำลัง 32 หรือตัวดำเนินการบิต^? stackoverflow.com/questions/62168128/…
bluejayke

2

จากนั้นจะมี Rosetta Code ซึ่งแสดง crc32 ที่ใช้งานในภาษาคอมพิวเตอร์หลายสิบภาษา https://rosettacode.org/wiki/CRC-32และมีลิงก์ไปยังคำอธิบายและการใช้งานมากมาย


1
ช่วยอธิบายหน่อยได้ไหม stackoverflow.com/questions/62168128/…
bluejayke

1

เพื่อลด crc32 ในการแจ้งเตือนคุณต้อง:

  1. สลับบิตในแต่ละไบต์
  2. xor สี่ไบต์แรกที่มี 0xFF (เพื่อหลีกเลี่ยงข้อผิดพลาดใน 0s นำหน้า)
  3. เพิ่มช่องว่างในตอนท้าย (นี่คือการทำให้ 4 ไบต์สุดท้ายมีส่วนร่วมในแฮช)
  4. คำนวณการแจ้งเตือน
  5. ย้อนกลับบิตอีกครั้ง
  6. x หรือผลลัพธ์อีกครั้ง

ในรหัสนี้คือ:


func CRC32 (file []byte) uint32 {
    for i , v := range(file) {
        file[i] = bits.Reverse8(v)
    }
    for i := 0; i < 4; i++ {
        file[i] ^= 0xFF
    }

    // Add padding
    file = append(file, []byte{0, 0, 0, 0}...)
    newReminder := bits.Reverse32(reminderIEEE(file))

    return newReminder ^ 0xFFFFFFFF
}

โดยที่เตือนความจำ IEEE คือการแจ้งเตือนที่แท้จริงใน GF (2) [x]


1
ฉันมีปัญหาเล็กน้อยในการทำความเข้าใจสิ่งนี้หรือไม่? stackoverflow.com/questions/62168128/…
bluejayke

1
เฮ้ @bluejayke ตรวจสอบไลบรารีนี้github.com/furstenheim/sparse_crc32/blob/master/main.goมันใช้ crc32 สำหรับไฟล์กระจัดกระจายคุณจะเห็นรายละเอียดที่สำคัญเกี่ยวกับการคำนวณ ไม่ได้รับการปรับให้เหมาะสมจึงง่ายต่อการติดตามมากกว่าการใช้งานปกติ อาจเป็นไปได้ว่าสิ่งที่คุณไม่เข้าใจคือส่วน GF (2) [x] โดยทั่วไป x ^ 3 + x หมายถึง 1010, x ^ 4 + x + 1 หมายถึง 10011 จากนั้นคุณต้องทำการหารตัวอย่างเช่น x ^ 3 + x คือ x * (x ^ 2 + 1) ดังนั้นการเตือนความจำของ x ^ 3 + x ส่วน x จึงเป็น 0 แต่มากกว่า x ^ 2 มันจะเป็น x ^ 2 * x + x นั่นคือการเตือนความจำจะเป็น x
Gabriel Furstenheim

1
@bluejayke และคำเตือน IEEE หมายถึงการเตือนความจำเกี่ยวกับพหุนามที่รู้จักกันดีพหุนาม IEEE
Gabriel Furstenheim

สวัสดีอีกครั้งขอบคุณสำหรับการตอบกลับของคุณ ฉันแค่พยายามทำความเข้าใจ (เพื่อวัตถุประสงค์ทางจาวาสคริปต์) สิ่งที่ "x" กำหนดค่าใหม่ในพหุนาม "x" เป็นคำรหัสสำหรับบางสิ่งที่ฉันขาดหายไปที่นี่หรือไม่ มีคำศัพท์มากมายที่ทำให้ฉันสับสนที่นี่ฉันไม่เคยได้ยิน CRC32 มาก่อนและแม้กระทั่งหลังจากค้นหาฉันก็ไม่พบคำอธิบายจริงๆ ตัวอย่างเช่น PNG ระบุว่าฉันต้องใช้ "CRC สำหรับแต่ละกลุ่ม" หมายความว่า "สำหรับข้อมูลทั้งหมดในกลุ่ม" หรือไม่ แต่ฉันจะ "เสียบ" กับพหุนามได้อย่างไร? "x" แสดงถึงอะไร? นอกจากนี้เมื่อพูดว่า x ^ 32 เช่น Math.pow (x, 32) หรือ bitwise ^
bluejayke

1
สวัสดี @bluejayke x เป็นนามธรรมที่ทำให้การคำนวณเป็นเรื่องง่าย ไม่คาดว่าจะถูกทดแทนด้วยสิ่งใด x ^ 2 ฉันหมายถึง x * x เป็นการคูณอย่างเป็นทางการ ที่นี่chrisballance.com/wp-content/uploads/2015/10/CRC-Primer.htmlคุณจะพบคำอธิบายที่ดีเกี่ยวกับการแบ่งนั้น สิ่งที่ฉันพยายามกับคำตอบคือเติมช่องว่างระหว่างการหาร (ในลิงค์นั้น) กับการคำนวณจริง
Gabriel Furstenheim
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.