delsum delsum เป็นแอปพลิเคชัน CLI สำหรับการค้นหาเช็คที่ใช้ในไฟล์
ปัจจุบันมีคำสั่งย่อยสามประการ:
check : ได้รับข้อมูลจำเพาะของอัลกอริทึมการตรวจสอบและรายการไฟล์สิ่งนี้เพียงแค่ส่งออกการตรวจสอบของไฟล์เหล่านี้part : ได้รับข้อมูลจำเพาะของอัลกอริทึมการตรวจสอบและรายการไฟล์ที่มีการตรวจสอบที่สอดคล้องกันสิ่งนี้จะค้นหาบางส่วนของไฟล์ที่มีการตรวจสอบที่กำหนดreverse : ได้รับรายการไฟล์ที่มีการตรวจสอบที่สอดคล้องกันซึ่งจะพบพารามิเตอร์การตรวจสอบที่ใช้ checkคำสั่งย่อยนี้คำนวณการตรวจสอบด้วยอัลกอริทึมที่กำหนด
ตัวอย่าง:
$ delsum check -m 'crc width=32 poly=0x4c11db7 init=0xffffffff xorout=0xffffffff refin=true refout=true' file_a file_b file_c
700b14f5,e1207917,79741cb2
อัลกอริทึมสามารถระบุได้โดยตรงเป็นอาร์กิวเมนต์ที่มี -m หรือรายการอัลกอริทึมสามารถระบุได้ในไฟล์
การเริ่มต้นหรือจุดสิ้นสุดของช่วงในการคำนวณการตรวจสอบของ IS ที่ได้รับด้วย -S หรือ -E และยังสามารถเป็นลบเพื่อให้พวกเขาสัมพันธ์กับจุดสิ้นสุด ตัวอย่างเช่นในการคำนวณการตรวจสอบของไบต์ทั้งหมดยกเว้นสองคนสุดท้ายหนึ่งระบุ -S 0 และ -E-3 (มันรวมอยู่ดังนั้น -3 จึงยังคงเป็นส่วนหนึ่งของผลรวม)
สำหรับอัลกอริทึมที่มีอยู่และวิธีการระบุให้ดูที่นี่
partคำสั่งย่อยนี้พบทุกส่วนของรายการไฟล์ที่ตรวจสอบทั้งหมดที่ได้รับการตรวจสอบ ส่วนของไฟล์ที่ตรงกันจะต้องมีไฟล์เหมือนกัน
ตัวอย่าง:
$ delsum part -m 'modsum width=16 module=ffff' -c 1234,5678,abcd file_a file_b file_c
modsum width=16 module=ffff:
0x8:-0x3
ในกรณีนี้การตรวจสอบการตรวจสอบในส่วน 0x8:-0x3 โดยที่ -0x3 นั้นสัมพันธ์กันตั้งแต่สิ้นสุด นี่เป็นช่วงที่ครอบคลุมซึ่งหมายความว่าการตรวจสอบที่ไปตั้งแต่ต้นจนจบจะมีช่วง 0x0:-0x1 หากไฟล์มีขนาด 15, 16 และ 18 ไบต์ตามลำดับการส่งออกนี้จะหมายความว่า
file_a มีการตรวจสอบ 1234 จากไบต์ 8 ถึง 13file_b มีการตรวจสอบ 5678 จากไบต์ 8 ถึง 14file_c มีการตรวจสอบ abcd จากไบต์ 8 ถึง 16 เราสามารถมีส่วนท้ายของชิ้นส่วนได้จากจุดเริ่มต้นของไฟล์ (และไม่ใช่จุดสิ้นสุด) โดยใช้ธง -s นอกจากนี้ -S และ -E อนุญาตให้หนึ่ง จำกัด ที่ช่วงเริ่มต้นและสิ้นสุดโดยการระบุช่วง (รวมถึง) ตัวอย่างเช่นเมื่อปกติช่วง 0x1:0xa , 0x3:0x10 และ 0x4:0xb จะเป็นเอาต์พุตโดยระบุ -S0x0:0x3 จะอนุญาตให้ส่วนเริ่มต้นของช่วงระหว่าง 0 ถึง 3 รวมดังนั้น 0x4 จะไม่ถูกพิมพ์ สิ่งนี้สามารถช่วยหลีกเลี่ยงผลบวกที่ผิดพลาดและยังสามารถลดเวลาในการดำเนินการได้
มีโอกาสเล็กน้อยที่จะส่งออกบางอย่างเช่น 0x1,0x6:0x5,0x10 เป็นเอาต์พุต นี่หมายความว่าการรวมกันแต่ละครั้งเป็นไปได้ ในกรณีนี้หนึ่งจะมี 0x1:0x5 , 0x1:0x10 และ 0x6:0x10 ในขณะที่ 0x6:0x5 ในทางทฤษฎีแล้วจะเป็นทางเลือก แต่ก็ไม่ได้ใช้งานได้เนื่องจากมันกลับไปข้างหลัง
ด้วยการใช้ประโยชน์จากความเป็นเส้นตรงของการตรวจสอบกระบวนการทั้งหมดนี้สามารถทำได้ในเวลาที่มีการบันทึกอย่างคร่าวๆ แต่เพียงจำไว้ว่ามันมีค่าใช้จ่ายสูง (เชิงเส้น) และคุณอาจหมดหน่วยความจำหากคุณเรียกใช้ไฟล์ 500MB
เราสามารถให้รายการอัลกอริทึมในไฟล์เป็นอินพุตเป็น -M สิ่งนี้มีประโยชน์เนื่องจากช่วยให้สามารถใส่อัลกอริทึมการตรวจสอบที่พบได้บ่อยที่สุดในนั้นและดูว่าอัลกอริทึมใด ๆ ในส่วนใดส่วนหนึ่งของไฟล์มีการตรวจสอบที่ต้องการหรือไม่ สำหรับอัลกอริทึมที่มีอยู่และวิธีการระบุให้ดูที่นี่
reverseคำสั่งย่อยนี้ค้นหาพารามิเตอร์ของอัลกอริทึมการตรวจสอบ
ด้วยไฟล์และการตรวจสอบที่กำหนดจะค้นหาพารามิเตอร์อัลกอริทึมเหล่านั้นซึ่งไฟล์ทั้งหมดมีการตรวจสอบที่กำหนด
โปรดทราบว่าอย่างน้อยอัลกอริทึมพื้นฐานและความกว้างของการตรวจสอบจะต้องระบุ (ตัวอย่างเช่น crc width=32 ) สำหรับอัลกอริทึมที่มีอยู่และวิธีการระบุให้ดูที่นี่
ตัวอย่าง:
$ delsum reverse -m 'crc width=32' -c 700b14f5,e1207917,79741cb2 file_a file_b file_c
crc width=32 poly=0x4c11db7 init=0xffffffff xorout=0xffffffff refin=true refout=true
โดยทั่วไปคุณต้องใช้ 3 ไฟล์และสำหรับอัลกอริทึมนอกเหนือจาก modsum อย่างน้อยหนึ่งไฟล์ต้องมีความยาวที่แตกต่างกัน นอกจากนี้ยังเป็นไปได้ที่จะระบุพารามิเตอร์บางอย่างของอัลกอริทึม (ใช้ตัวอย่างเช่น -m 'crc width=32 init=0' ) ซึ่งต้องการไฟล์น้อยลงหรือให้ผลบวกปลอมน้อยลง
หากคุณมีเพียงไฟล์ที่มีความยาวที่กำหนดเท่านั้น แต่ยังใส่ใจเกี่ยวกับการตรวจสอบความยาวนั้นเท่านั้นสำหรับอัลกอริทึมที่ไม่ใช่ modsum คุณสามารถตั้งค่า init=0
โดยปกติแล้วจะค่อนข้างเร็ว ตัวอย่างเช่นรันไทม์สำหรับอัลกอริทึมการย้อนกลับของ CRC นั้นอยู่ในกรณีส่วนใหญ่รอบ O(n*log^2(n)*log(log(n))) โดยที่ n คือไฟล์ไฟล์ซึ่งต้องขอบคุณอัลกอริทึม GCD ที่รวดเร็วที่นำมาใช้ภายในไลบรารี NTL และ GF2X
สำหรับพารามิเตอร์บางตัวจะมีการค้นหาชุดค่าผสมเท่านั้น:
wordsize ถูกค้นหาเพื่อพลังของ 2 ทวีคูณของ 8 ที่มีขนาดเล็กกว่าหรือเท่ากับ widthrefin และ refout จะค้นหา refin = refout ในการค้นหาพารามิเตอร์เหล่านี้ให้ระบุด้วยตนเองหรือใช้อาร์กิวเมนต์ CLI --extended-search
ขณะนี้มีอัลกอริทึมสามครอบครัว: modsum , fletcher และ crc พวกเขามีการระบุเช่นนี้: algofamiliy width=123 para1=ff para2=true para3=10 name="algoname" โปรดทราบว่าพารามิเตอร์ตัวเลขทั้งหมดยกเว้น width และ wordsize อยู่ในเลขฐานสิบหก
ปัจจุบันสิ่งเหล่านี้มีการแชร์จำนวนผลรวมทั้งหมด:
width : ความกว้างของการตรวจสอบเป็นบิตout_endian : endian of the Checksum สามารถเป็นได้ทั้ง little หรือ bigwordsize : จำนวนบิตของคำในข้อความอินพุต ต้องเป็นหลาย 8 และระหว่าง 8 และ 64 ตัวอย่างเช่นในการตรวจสอบอย่างง่ายโดยใช้ wordsize=16 จะสับไฟล์ลงในจำนวนเต็ม 16 บิตและเพิ่ม module โมดูลin_endian : Endian ของคำพูดสามารถเป็นได้ทั้ง little หรือ bigmodsum ผลรวมแบบโมดูลาร์อย่างง่ายพร้อม width พารามิเตอร์ init และ module
สอดคล้องกับ
sum = init
for byte in file:
sum = (sum + byte) % module
return sum
โปรดทราบว่าสำหรับ module 0 มันเทียบเท่ากับ 2^width
ค่าเริ่มต้นสำหรับ module และ init เป็นทั้ง 0
fletcher ผลรวมเหมือนเฟลตเชอร์ที่มี width พารามิเตอร์, init , addout , module และ swap
สอดคล้องกับ
sum1 = init
sum2 = 0
for byte in file:
sum1 = (sum1 + byte) % module
sum2 = (sum2 + sum1) % module
sum1 = (sum1 + addout.sum1) % module
sum2 = (sum2 + addout.sum2) % module
if not swap:
returm (sum2 << (width/2)) | sum1
else:
returm (sum1 << (width/2)) | sum2
มันเป็นเอาต์พุตในรูปแบบ "บรรจุ" ซึ่ง SUM1 ถูกเก็บไว้ในความกว้างต่ำ/2 บิตและ SUM2 ในความกว้างที่สูงขึ้น/2 (หรือตรงกันข้ามถ้าเปิดใช้งาน swap ) พารามิเตอร์คือ:
width : ความกว้างของการตรวจสอบทั้งหมด บังคับ.module : ค่าที่จะลด module = 0 หมายถึง 2^(width/2) และเป็นค่าเริ่มต้นinit : ค่าเริ่มต้นการตรวจสอบปกติด้วย ค่าเริ่มต้นเป็น 0addout : ค่าที่บรรจุซึ่งเพิ่มในตอนท้ายของผลรวม ส่วนที่สูงจะถูกเพิ่มเข้าไปในส่วนที่สูงของการตรวจสอบในตอนท้ายโดยไม่คำนึงถึง swap ค่าเริ่มต้นถึง 0swap : ธงบูลีนซึ่งระบุว่าผลรวมปกติควรอยู่ในครึ่งที่สูงกว่าของการตรวจสอบที่บรรจุ ค่าเริ่มต้นเป็น falsecrcอัลกอริทึม CRC ที่มีพารามิเตอร์ตามโมเดล Rocksoft^tm ตามที่บันทึกไว้ใน "คู่มือที่ไม่เจ็บปวดในการตรวจจับข้อผิดพลาด CRC"
มันมีพารามิเตอร์ต่อไปนี้:
width : ความกว้างในบิตของการตรวจสอบ (และระดับของโพลี) บังคับ.poly : พหุนามเครื่องกำเนิดไฟฟ้าในสัญกรณ์ปกติ บังคับ (ยกเว้น reverse )init : ค่าเริ่มต้นของสถานะ CRC ค่าเริ่มต้นถึง 0xorout : ค่าสุดท้ายถึง XOR ถึงผลรวม ค่าเริ่มต้นถึง 0refin : ธงบูลีนระบุว่าจะสะท้อนบิตของไบต์อินพุตหรือไม่ ค่าเริ่มต้นเป็น falserefout : ธงบูลีนที่ระบุว่าจะสะท้อนบิตของการตรวจสอบขั้นสุดท้ายก่อนที่จะเพิ่ม xorout ค่าเริ่มต้นเป็น false โปรดทราบว่าค่าอื่น ๆ สำหรับ wordsize ด้วย in_endian=little (มาตรฐาน) เหมือนกับการแลกเปลี่ยนไบต์ในแต่ละกลุ่มของบิต wordsize ก่อนที่จะคำนวณ wordsize=8 ตรวจสอบ
คำอธิบายบางอย่าง (ไม่สมบูรณ์) ของอัลกอริทึมที่ใช้พบได้ที่นี่
มีการสร้าง Linux ซึ่งมีไลบรารี NTL ที่รวบรวมไว้ที่นี่ แต่โปรดจำไว้ว่ามันถูกรวบรวมโดยไม่มีส่วนขยาย X86 ที่ทันสมัยที่สุดและดังนั้นจึงไม่สามารถใช้ประโยชน์จากกิจวัตรที่ดีที่สุดใน gf2x ซึ่งทำให้ CRC กลับตัวได้เร็วขึ้นมาก ฉันก็โง่เกินไปที่จะสร้าง Windows Build ดังนั้นขอโทษด้วย
โปรแกรมนี้เชื่อมโยงกับ NTL , gf2x และ gmp
หากคุณอยู่ในระบบที่ใช้ Debian คุณสามารถติดตั้งได้ด้วย
apt-get install libgmp-dev libgf2x-dev libntl-dev
นอกจากนี้คุณยังสามารถรวบรวมพวกเขาเองดูที่นี่ โดยทั่วไปจะทำให้ไบนารีที่เร็วที่สุดเนื่องจากสามารถใช้ส่วนขยายชุดคำสั่งและยังมีความเป็นไปได้ในการปรับพารามิเตอร์อัลกอริทึม
หากคุณติดตั้ง cargo ควรเป็นไปได้ที่จะรวบรวมสิ่งนี้ในรูทไดเรกทอรีโครงการด้วย
cargo install --path .
หรือโดยไม่ต้องดาวน์โหลดที่เก็บด้วย
cargo install delsum
หากคุณต้องการเชื่อมโยงไลบรารี NTL แบบคงที่คุณสามารถตั้งค่าตัวแปรสภาพแวดล้อม DELSUM_STATIC_LIBS=1 เมื่อทำงาน cargo
รหัสของโครงการนี้ได้รับอนุญาตภายใต้ใบอนุญาต MIT