61 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
| This file is part of Telegram Desktop,
 | |
| the official desktop application for the Telegram messaging service.
 | |
| 
 | |
| For license and copyright information please follow this link:
 | |
| https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 | |
| */
 | |
| #include "base/crc32hash.h"
 | |
| 
 | |
| namespace base {
 | |
| namespace {
 | |
| 
 | |
| class Crc32Table {
 | |
| public:
 | |
| 	Crc32Table() {
 | |
| 		auto poly = std::uint32_t(0x04c11db7);
 | |
| 		for (auto i = 0; i != 256; ++i) {
 | |
| 			_data[i] = reflect(i, 8) << 24;
 | |
| 			for (auto j = 0; j != 8; ++j) {
 | |
| 				_data[i] = (_data[i] << 1) ^ (_data[i] & (1 << 31) ? poly : 0);
 | |
| 			}
 | |
| 			_data[i] = reflect(_data[i], 32);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	std::uint32_t operator[](int index) const {
 | |
| 		return _data[index];
 | |
| 	}
 | |
| 
 | |
| private:
 | |
| 	std::uint32_t reflect(std::uint32_t val, char ch) {
 | |
| 		auto result = std::uint32_t(0);
 | |
| 		for (int i = 1; i < (ch + 1); ++i) {
 | |
| 			if (val & 1) {
 | |
| 				result |= 1 << (ch - i);
 | |
| 			}
 | |
| 			val >>= 1;
 | |
| 		}
 | |
| 		return result;
 | |
| 	}
 | |
| 
 | |
| 	std::uint32_t _data[256];
 | |
| 
 | |
| };
 | |
| 
 | |
| } // namespace
 | |
| 
 | |
| std::int32_t crc32(const void *data, int len) {
 | |
| 	static const auto kTable = Crc32Table();
 | |
| 
 | |
| 	const auto buffer = static_cast<const std::uint8_t*>(data);
 | |
| 
 | |
| 	auto crc = std::uint32_t(0xffffffff);
 | |
| 	for (auto i = 0; i != len; ++i) {
 | |
| 		crc = (crc >> 8) ^ kTable[(crc & 0xFF) ^ buffer[i]];
 | |
| 	}
 | |
| 
 | |
| 	return static_cast<std::int32_t>(crc ^ 0xffffffff);
 | |
| }
 | |
| 
 | |
| } // namespace base
 | 
