सीआरसी कार्यान्वयन गति के लिए टेबल का उपयोग करें। वे आवश्यक नहीं हैं।
यहां कास्टगोनोली बहुपद (या इंटेल क्रैक 32 निर्देश द्वारा उपयोग किए जाने वाले समान) या ईथरनेट बहुपद (जैसे ज़िप, gzip, आदि में उपयोग किया जाता है) का उपयोग कर एक छोटा सीआरसी 32 है।
#include <stddef.h>
#include <stdint.h>
/* CRC-32C (iSCSI) polynomial in reversed bit order. */
#define POLY 0x82f63b78
/* CRC-32 (Ethernet, ZIP, etc.) polynomial in reversed bit order. */
/* #define POLY 0xedb88320 */
uint32_t crc32c(uint32_t crc, const unsigned char *buf, size_t len)
{
int k;
crc = ~crc;
while (len--) {
crc ^= *buf++;
for (k = 0; k < 8; k++)
crc = crc & 1 ? (crc >> 1)^POLY : crc >> 1;
}
return ~crc;
}
प्रारंभिक crc
मान शून्य होना चाहिए। नियमित रूप से सीआरसी को अद्यतन करने के लिए डेटा के हिस्सों के साथ नियमित रूप से कहा जा सकता है। आप गति के लिए आंतरिक पाश को अनलोल कर सकते हैं, हालांकि आपका कंपाइलर वैसे भी आपके लिए ऐसा कर सकता है।
स्रोत
2015-01-14 19:26:19
सीआरसी 32 को 256k लुकअप टेबल संस्करण की तुलना में कोई बड़ी गति जुर्माना के बिना, यदि आप को बिना किसी लुकअप टेबल के साथ लागू किया जा सकता है, या 1k-byte लुकअप टेबल के साथ लागू किया जा सकता है। Http://wiki.osdev.org/CRC32 पर उदाहरण। यदि आपको वास्तव में बाइट्स को सहेजना है, तो adler32 का उपयोग करें। – dascandy
'संसाधनों के साथ आपका क्या मतलब है बहुत दुर्लभ'? 64 एमबी से कम, 8 केबी से कम या 512byte से कम? – jeb
जेब: बहुत दुर्लभ माध्यमों में वर्तमान में मेरे पास http://www.opensource.apple.com/source/xnu/xnu-1456.1.26/bsd/libkern/crc32.c में दिखाए गए तालिका को जोड़ने के लिए पर्याप्त स्थान नहीं है। – Elmi