সিআরসি-র একটি দ্রুত বিকল্প কি?


27

আমি ডিএসপিক থেকে কোনও পিসিতে কিছু ডেটা ট্রান্সমিশন করছি এবং কোনও ত্রুটি নেই তা নিশ্চিত করার জন্য আমি 512 বাইটের প্রতিটি ব্লকে একটি 8-বিট সিআরসি করছি। আমার সিআরসি কোড সক্ষম হয়ে আমি প্রায় 33 কেবি / গুলি পাই, এটি ছাড়াই আমি 67 কেবি / এস পাই s

দ্রুত হতে পারে তা পরীক্ষা করার জন্য কিছু বিকল্প ত্রুটি সনাক্তকরণ অ্যালগরিদম কী কী?


5
কীভাবে সিআরসি বাস্তবায়িত হয়? Bitwise? তারপরে একটি টেবিল-ভিত্তিক পদ্ধতিতে স্যুইচ করুন। Bytewise? টেবিলের আকার বাড়ানোর সাথে জড়িত স্থান, জটিলতা এবং সময়ের ব্যবসায়ের বিষয়টি বিবেচনা করুন, বলুন, 16 বিট (যা একবারে দুটি বাইটে পরিচালনা করবে তবে টেবিল স্টোরেজটি 64KB নেবে)।
এডান

আমার কাছে কেবল র‌্যামে 16KB এবং 128KB রম রয়েছে, সুতরাং একটি 64 কেবি টেবিল বিকল্প নয়।
ফিগব্যাগ

1
সুতরাং আপনি একটি 256 বাইট টেবিল ব্যবহার করছেন? বা বিটওয়াস সিআরসি? আপনি যদি বিটওয়াইসটি করেন তবে বাই বাইওয়ান (256-বাইট টেবিল সহ) 8 গুণ দ্রুত হবে।
আইডান জুলি

বিটওয়াইস বর্তমানে, আমি একটি 256 টেবিল চেষ্টা করব
ফিগব্যাগ

1
67 কেবি / এস থেকে 33 কেবি / সে? আপনার অন্যান্য প্রসেসিংয়ের সাথে কী জড়িত তা আমি নিশ্চিত নই, তবে এটি একটি পিকের জন্যও বেশ কিছুটা ওভারহেডের মতো শোনাচ্ছে। আপনার কার্য সম্পাদনকে বাধা দিতে পারে এমন আরও কিছু সমস্যা আছে?
রেই মিয়াসাকা

উত্তর:


41

সিআরসি-র চেয়ে আরও দ্রুত বিকল্প থাকতে পারে, আপনি যদি সেগুলি ব্যবহার করেন তবে আপনি সম্ভবত কিছুটা ত্রুটি সনাক্তকরণের ক্ষমতা ত্যাগ করতেই পারেন। আপনার ত্রুটি সনাক্তকরণের প্রয়োজনীয়তাগুলি নির্ভর করে তার পরিবর্তে আপনার অ্যাপ্লিকেশনটিতে সিআরসি কোডটি অপ্টিমাইজ করা বিকল্প হতে পারে।

অন্যান্য অপশন সঙ্গে সিআরসি একটি তুলনামূলক জন্য, দেখুন চমৎকার দ্বারা উত্তর মার্টিন থম্পসন

এর সাথে সাহায্য করার জন্য একটি বিকল্প হ'ল পাইক্রিসি যা একটি সরঞ্জাম (পাইথন 1 এ লিখিত ) যা সিআরসি মডেল এবং অ্যালগরিদমের কয়েক ডজন সংমিশ্রনের জন্য সি উত্স কোড উত্পন্ন করতে পারে । এটি আপনাকে বিভিন্ন সংমিশ্রণ নির্বাচন করে এবং বেঞ্চমার্ক করে আপনার নিজের অ্যাপ্লিকেশনের জন্য গতি এবং আকারকে অনুকূল করতে দেয় ize 1: পাইথন 2.6 বা তার পরে প্রয়োজন।

এটি সমর্থন crc-8 মডেল , কিন্তু সমর্থন crc-5, crc-16এবং crc-32অন্যদের মধ্যে। আলগোরিদিম হিসাবে , এটি সমর্থন করে bit-by-bit, bit-by-bit-fastএবং table-driven

উদাহরণস্বরূপ (সংরক্ষণাগার ডাউনলোড করা):

$ wget --quiet http://sourceforge.net/projects/pycrc/files/pycrc/pycrc-0.8/pycrc-0.8.tar.gz/download
$ tar -xf pycrc-0.8.tar.gz
$ cd pycrc-0.8
$ ./pycrc.py --model=crc-8 --algorithm=bit-by-bit      --generate c -o crc8-byb.c
$ ./pycrc.py --model=crc-8 --algorithm=bit-by-bit-fast --generate c -o crc8-bybf.c
$ ./pycrc.py --model=crc-8 --algorithm=table-driven    --generate c -o crc8-table.c
$ ./pycrc.py --model=crc-16 --algorithm=table-driven   --generate c -o crc16-table.c
$ wc *.c
   72   256  1790 crc8-byb.c
   54   190  1392 crc8-bybf.c
   66   433  2966 crc8-table.c
  101   515  4094 crc16-table.c
  293  1394 10242 total

এমনকি 256 বাইট লুক-আপ টেবিলের সাহায্যে একক বাইট লুক-আপের পরিবর্তে দ্বৈত নিবল প্রহরীগুলি (16 বাইট লুক-আপ টেবিল সহ) ব্যবহার করে নির্দিষ্ট করার মতো মজাদার জিনিস আপনি করতে পারেন।

উদাহরণস্বরূপ (গিট সংগ্রহস্থল ক্লোনিং):

$ git clone http://github.com/tpircher/pycrc.git
$ cd pycrc
$ git branch
* master
$ git describe
v0.8-3-g7a041cd
$ ./pycrc.py --model=crc-8 --algorithm=table-driven --table-idx-width=4 --generate c -o crc8-table4.c
$ wc crc8-table4.c
  53  211 1562 crc8-table4.c

আপনার স্মৃতি এবং গতির সীমাবদ্ধতা দেওয়া, এই বিকল্পটি গতি এবং কোড আকারের মধ্যে সেরা সমঝোতা হতে পারে। নিশ্চিত হওয়ার একমাত্র উপায় যদিও এটি মানদণ্ড করা bench


Pycrc Git সংগ্রহস্থলের হয় GitHub তার হয়, বিষয়টি যে ব্যক্তি অনুসরণ করে , কিন্তু এটি থেকে ডাউনলোড করা যাবে SourceForge


আমি বিশ্বাস করি না যে বেশিরভাগ লোকেরা পিকের জন্য জিনিস লেখেন তারা সি ব্যবহার করছেন তবে এটি যদি তা হয় তবে তা কার্যকর হতে পারে।
বিলি ওনিল

4
@ বিলি - সত্যি? আমি মনে করি না যে আমি পিআইসির জন্য বাণিজ্যিকভাবে বিকাশকারী এমন কাউকে পেয়ে এসেছি যিনি সি ব্যবহার করছেন না আমি অবশ্যই আজকাল এসেম্বলারের জন্য ধৈর্য রাখি না এবং সুগঠিত সি বেশ কমপ্যাক্ট পর্যন্ত শেষ করতে পারে।
মার্ক বুথ

আমি একটি dsPIC ব্যবহার করছি এবং আমি সি ব্যবহার করছি
ফিগব্যাগ

@ ফিগব্যাগ - ধন্যবাদ, আপনি আমার উত্তর পছন্দ করেছেন বলে খুশী। আপনি যদি কিছু বেঞ্চমার্ক পরীক্ষা চালান তবে আপনার ফলাফলগুলি সহ আমার উত্তর সম্পাদনা করতে নির্দ্বিধায়। আপনার অ্যাপ্লিকেশন থ্রুপুট এবং মেমরির পদক্ষেপের ক্ষেত্রে প্রতিটি অ্যালগরিদম কতটা তফাত করে তা আমি জানতে চাই।
মার্ক বুথ

1
পাইকিআরসিআর-এর জন্য অন্য একটি ভোট। এটি বিভিন্ন প্রকল্পে বিভিন্ন সীমাবদ্ধতার সাথে ব্যবহার করে এবং এটি দুর্দান্ত।
ভিকি

11

সাধারণ এক বিট প্যারিটি (মূলত নিজের উপর থেকে ডেটা এক্সওরিং করা) যত দ্রুত পাওয়া যায় তত দ্রুত। আপনি যদিও সিআরসি-তে ত্রুটি পরীক্ষা করে অনেক হারিয়ে ফেলেন।

সিউডোকোডে:

char checksum = 0;
for each (char c in buffer)
{
    checksum ^= c;
    SendToPC(c);
}
SendToPc(checksum);

1
আমি কিছুক্ষণ আগে এটি তাকিয়ে ছিল। আমি বিশ্বাস করি যে জোরের পরিবর্তে সামিং আসলে কিছুটা ভাল কাজ করে। (সাধারণত, সমস্ত কিছু যোগ করুন, এবং তারপরে চেকসাম হিসাবে যোগফলের 2 এর পরিপূরকটি প্রেরণ করুন the রিসিভারে, চেকসাম প্রাপ্ত সমস্ত কিছু যোগ করুন The ফলাফলটি যদি ভাল হয় তবে 0 হয় এবং অন্যথায় 0 হয় না))
দ্রুত_

1
@ চটজলদি: আমি মনে করি না যে এই দুজনের মধ্যে একটি উল্লেখযোগ্য পার্থক্য আছে - না কোনও পদ্ধতিই এত ভাল একটি আশ্বাস দেয় যে জিনিসগুলি ক্ষতিগ্রস্থ হয়নি। যদি যুক্ত আর্কিটেকচারে সমস্ত উপায়ে দ্রুত হয় তবে তার পরিবর্তে এটি ব্যবহার করুন।
বিলি ওনিল

7
আমার মনে আছে: ADD এবং XOR এর মধ্যে প্রধান পার্থক্যটি হ'ল একাধিক বিট ত্রুটির সনাক্তকরণযোগ্যতা কম। বাইটস স্ট্রিমের ক্ষেত্রে, এক্সওআর ব্যবহার করে একই বিট পজিশনে ত্রুটি বাতিল করা হয়। এডিডি ব্যবহার করার সময়, চেকসাম বাইটের মাধ্যমে বিটের আপ প্রচারের অর্থ এই কেসটি আরও সনাক্তযোগ্য। (তবে, বাইটগুলির প্রবাহের মাধ্যমে ছড়িয়ে থাকা বিভিন্ন বিটগুলিতে একাধিক বিট ত্রুটিগুলি সনাক্তকরণের সম্ভাবনা কম রয়েছে - সেই সময়ের পরিস্থিতিগুলির উপর নির্ভর করে)। এর মতো যে কোনও চেকসামের ব্যবস্থা হ'ল একাধিক-বিট ত্রুটির জন্য মারাত্মক, সুতরাং এটি মোটামুটি ছোটখাটো যুক্তি।
দ্রুত

এক্সওআর সিআরসি থেকে অনেক কম সহায়ক।

3
@ থরবজর্ন: আমি বিশ্বাস করি যে আমি আমার উত্তরে তা স্বীকার করেছি। :)
বিলি ওনিল

10

এম্বেড থাকা প্রসঙ্গে বিভিন্ন চেকসাম এবং সিআরসি-র কার্যকারিতার তুলনা করার জন্য একটি সত্যই ভাল কাগজ:

এম্বেড নেটওয়ার্কগুলির জন্য চেকসামগুলির কার্যকারিতা

সিদ্ধান্তগুলি থেকে কিছু উদ্ধৃতি (তদন্তের ত্রুটির সম্ভাবনার উপর তাদের গবেষণার ভিত্তিতে):

বিস্ফোরণ ত্রুটি যখন আধিপত্য

এক্সওআর, দুটির পরিপূরক সংযোজন এবং সিআরসি চেকসামগুলি নিজের পরিপূরক সংযোজন, ফ্লেচার এবং অ্যাডলার চেকসামগুলির চেয়ে ত্রুটি সনাক্তকরণের কার্যকারিতা সরবরাহ করে।

অন্যান্য অ্যাপ্লিকেশনগুলিতে

একটি "ভাল" সিআরসি বহুপদী, যখনই সম্ভব, ত্রুটি সনাক্তকরণের উদ্দেশ্যে ব্যবহার করা উচিত

যদি গণনা ব্যয় খুব সীমাবদ্ধ হয়

(আপনার ক্ষেত্রে যেমন), ব্যবহার করুন (কার্যকারিতা অনুসারে):

অন্যান্য উদ্ধৃতি:

ফ্ল্যাচার চেকসামের অ্যাডলার চেকসামের তুলনায় কম গণনা ব্যয় হয় এবং জনপ্রিয় বিশ্বাসের বিপরীতে, বেশিরভাগ পরিস্থিতিতে এটি আরও কার্যকর।

এবং

নতুন ডিজাইনে এক্সওআর চেকসাম ব্যবহারের প্রচলিত অনুশীলন চালিয়ে যাওয়ার কোনও কারণ নেই, কারণ এটিতে একটি অতিরিক্ত ভিত্তিক চেকসাম হিসাবে একই সফ্টওয়্যার গণনা ব্যয় রয়েছে তবে ত্রুটিগুলি সনাক্ত করতে এটি প্রায় অর্ধেক কার্যকর।


1
বোনাস হিসাবে, একটি ফ্লেচার চেকসাম কার্যকর করা খুব সহজ।
রাবারডাক

6

এডলার চেকসাম সংক্রমণ বিকৃতি পরীক্ষা করার জন্য যথেষ্ট হওয়া উচিত। এটি জালিব সংক্ষেপণ গ্রন্থাগার দ্বারা ব্যবহৃত হয়েছে এবং একটি দ্রুত কিন্তু কার্যকর ডেটা অখণ্ডতা পরীক্ষা দিতে জাভা 3 ডি মোবাইল গ্রাফিক্স স্ট্যান্ডার্ড দ্বারা গৃহীত হয়েছিল।

থেকে উইকিপিডিয়া পৃষ্ঠা :

দুটি অ্যাডলার -32 চেকসাম দুটি 16-বিট চেকসাম এ এবং বি গণনা করে এবং তাদের বিটগুলি 32-বিট সংখ্যায় পূর্ণ করে is A হ'ল স্ট্রিং প্লাস ওয়ান এর সমস্ত বাইটের যোগফল এবং বি প্রতিটি পদক্ষেপ থেকে A এর স্বতন্ত্র মানের যোগফল।

অ্যাডলার -২২ রানের শুরুতে, এটিকে 1, বি থেকে 0 এ সূচনা করা হয় The বাইটগুলি নেটওয়ার্ক ক্রমে (বিগ এন্ডিয়ান) সংরক্ষণ করা হয়, বি দুটি সবচেয়ে উল্লেখযোগ্য বাইট দখল করে।

ফাংশন হিসাবে প্রকাশ করা যেতে পারে

 A = 1 + D1 + D2 + ... + Dn (mod 65521)
 B = (1 + D1) + (1 + D1 + D2) + ... + (1 + D1 + D2 + ... + Dn) (mod 65521)
   = n×D1 + (n-1)×D2 + (n-2)×D3 + ... + Dn + n (mod 65521)

 Adler-32(D) = B × 65536 + A

যেখানে ডি হল বাইটের স্ট্রিং যার জন্য চেকসাম গণনা করতে হবে, এবং n ডি এর দৈর্ঘ্য is


মনে রাখবেন যে অ্যাডলার 32 ডেটার সংক্ষিপ্ত রানের জন্য প্রায় অকেজো। প্রায় 180 বাইট অবধি এটি বহু সংঘর্ষের সৃষ্টি করে।
গ্রেফ্যাড

+1 - একটি সিআরসি এবং সাধারণ বিট প্যারিটির মধ্যে একটি যুক্তিসঙ্গত মাঝারি স্থল।
বিলি ওনিল

@ গ্রেফ্যাড - ফিগারব্যাগ 512 বাইট ব্লক ব্যবহার করে উল্লিখিত হয়েছে, সুতরাং এটি ওপি-তে সমস্যা হওয়া উচিত নয়। এটি অন্যান্য প্রয়োজনীয়তাযুক্ত লোকদের জন্য উল্লেখ করা ভাল।
মার্ক বুথ

5

আমি সিআরসি হিসাবে ত্রুটি সনাক্তকরণে কার্যকর এবং দ্রুত - এমন কিছু সম্পর্কে অবগত নই - যদি সেখানে থাকত তবে লোকেরা পরিবর্তে এটি ব্যবহার করত।

আপনি একটি সাধারণ চেকসাম চেষ্টা করতে পারেন, তবে এটির ত্রুটি সনাক্ত করার সম্ভাবনা কম।


2
আমি গতির জন্য একটি কার্যকারিতা ত্যাগ করতে ইচ্ছুক।
ফিগব্যাগ

3

চেকসাম যুক্তি নিজেই ভাল এবং লোকেরা দ্রুত অ্যালগরিদমে সাহায্য করতে পারে।

আপনি যদি আপনার উপাদানটির গতি উন্নত করতে চান তবে আপনাকে বৈধতা উপাদান থেকে স্থানান্তর উপাদানটি আলাদা করতে আপনার সামগ্রিক কৌশলটি পরিবর্তন করতে হবে।

যদি আপনার কাছে এটি দুটি স্বতন্ত্র আইটেম হিসাবে থাকে (বিভিন্ন থ্রেডে) তবে আপনি স্থানান্তরের পুরো গতি পেতে পারেন এবং কেবল ব্যর্থ প্যাকেটগুলি পুনরায় পাঠাতে পারেন।

অ্যালগরিদম এমন কিছু দেখায়:

  • সার্ভারটি পরিচিত প্যাকেটের আকারগুলিতে বিভক্ত হয় (বলুন 1K অংশগুলি)। এগুলিকে "প্রেরণ করা হবে" এর একটি কাতারে রাখে।
  • প্রতিটি প্যাকেট 16 বা 32 বিট আইডি এবং এর চেকসামের মাধ্যমে প্রেরণ করা হয়।
  • ক্লায়েন্ট প্রতিটি প্যাকেট গ্রহণ করে এবং প্রক্রিয়া করার জন্য এটি একটি সারিতে রাখে।
  • পৃথক থ্রেডে ক্লায়েন্ট একবারে একটি প্যাকেট নেয়, যাচাই করে।
    • সাফল্যের সাথে এটি প্যাকেটগুলির চূড়ান্ত সংগ্রহের (আইডি ক্রমে) যুক্ত হয়
    • ব্যর্থতার সাথে এটি ব্যর্থ আইডিটিকে সার্ভারের কাছে ফিরিয়ে দেয়, যা সেই প্যাকেটটিকে পুনরায় পাঠাতে সারি করে।
  • একবার আপনি প্যাকেটগুলি পুনরুদ্ধার ও যাচাই করে নেওয়ার পরে এবং সঠিক আইকনসটি আইডি থাকলে (1 থেকে শুরু করে) আপনি ডিস্কে এগুলি লিখতে শুরু করতে পারেন (বা যা প্রয়োজন হয় তা করতে পারেন)।

এটি আপনাকে সর্বোচ্চ সম্ভাব্য গতিতে ট্র্যাসমিট করতে দেয় এবং আপনি যদি আপনার প্যাকেটের আকারের সাথে খেলেন তবে আপনি সর্বোত্তম ব্যর্থতার হার VS বৈধতা / পুনর্বিবেচনার হারটি কার্যকর করতে পারেন।


2

চেকসামগুলি প্রচলিত

(# '+ স্ট্রিম হ্রাস করুন)

উপরে বর্ণিত এক্সওআরও কাজ করবে

(# 'এক্সওর স্ট্রিম হ্রাস করুন)

কিছুটা আরও বিস্তৃত (ধীর) স্কিম হল সিরিয়াল সংযোগগুলির জন্য স্ট্যান্ডার্ড প্যারিটি চেক।

এই স্তরে, আপনি গতির জন্য সঠিকতা ট্রেড করছেন। এগুলি মাঝে মাঝে ব্যর্থ হবে।

পরবর্তী অত্যন্ত পরিশীলিত স্তরে, আপনি কিছু সিআরসি / হ্যাশ টাইপ স্টাফ ব্যবহার করতে পারেন।

আর একটি ডিজাইন হ'ল স্ট্রিমের জন্য ব্যবহৃত ব্লকের আকার বাড়ানো।

আপনার অ্যালগোরিদম নির্বাচন এবং ব্লক আকারের জন্য পরামিতিগুলি টিউন করতে আপনার প্রকৃত ত্রুটি হারের একটি অনুমান হওয়া উচিত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.