CRC.H:
class Crc32
{
public:
Crc32();
/*Функция, вычисляющая контрольную сумму
для переданной null - terminated строки.*/
unsigned int ProcessString(const char* s);
private:
unsigned int table[256];
};
CRC.CPP:
#include "Crc32.h"
Crc32::Crc32()
{
const unsigned int CRC_POLY = 0xEDB88320;
unsigned int i, j, r;
for (i = 0; i < 256; i++)
{
for (r = i, j = 8; j; j--) r = r & 1? (r >> 1) ^ CRC_POLY: r >> 1;
table = r;
}
}
unsigned int Crc32::ProcessString(const char* s)
{
const unsigned int CRC_MASK = 0xD202EF8D;
register const unsigned char* pdata = reinterpret_cast<const unsigned char*>(s);
register unsigned int crc = 0; //_resultCrc32;
static int i = 0;
for(i = 0; pdata; )
{
crc = table[static_cast<unsigned char>(crc) ^ *pdata++] ^ crc >> 8;
crc ^= CRC_MASK;
}
return crc;
}
Алгоритм подсчета CRC32 в PHP
Собственно сабж. По какому именно алгоритму работает PHP-функция crc32()? Копаться в исходниках РНР не советовать.
самое вменяемое описание — на википедии:
Цитата: foxweb
самое вменяемое описание — на википедии: http://ru.wikipedia.org/wiki/CRC32
энциклопедии люблю с детства :)
энциклопедии люблю с детства :)
=) А ты уверен что в РНР реализован именно этот алгоритм?
ты думаешь, под одним и тем же именем могут скрываться принципиально разные алгоритмы? если ты так думаешь, проверить на практике недолго.
На проверку времени нет. Придется вместо CRC использовать MD5 - расчеты тяжелее зато есть стандартный алгоритм.
В свое время много собак съел с CRC32
Цитата: mike
Не правда, CRC32 все считают одинаково. Результат записывают по разному - в MySql - это целое без знака, в PHP - целое со знаком.
В свое время много собак съел с CRC32
В свое время много собак съел с CRC32
Значит должен быть стандарт. Где его искать?
Во во)))) если подчет контрольной суммы работает во многих языках и на многих платформах одинаково, то спеца должно быть однозначно.
Прошу прощения, что на С++, но сам алгоритм тот же. Пример для NULL - terminate строки, недавно как то писал:) Может, кому интересно будет.