Microsoft MVP성태의 닷넷 이야기
닷넷: 2371. C# - CRC64 (System.IO.Hashing의 약식 버전) [링크 복사], [링크+제목 복사],
조회: 482
글쓴 사람
정성태 (seongtaejeong at gmail.com)
홈페이지
첨부 파일

C# - CRC64 (System.IO.Hashing의 약식 버전)

그러고 보니 CRC32는 소개했어도,

Golang, Python, C#에서의 CRC32 사용
; https://www.sysnet.pe.kr/2/0/13124

CRC64를 빼먹었군요. ^^ 닷넷의 경우, CRC64 계산은 "package-provided"로 별도 제공하는 (CRC32가 있었던 바로 그) System.IO.Hashing 어셈블리에 포함돼 있습니다.

Crc64 Class
; https://learn.microsoft.com/en-us/dotnet/api/system.io.hashing.crc64

따라서 nuget으로부터 설치해,

Install-Package System.IO.Hashing

간단하게 사용할 수 있는데요,

// 정적 메서드를 이용해 바로 계산

byte[] data = System.Text.Encoding.UTF8.GetBytes("Hello, CRC64!");
Console.WriteLine(Crc64.HashToUInt64(data)); // 출력 결과: 11672975025148400158

// 또는 인스턴스 메서드를 사용해 추가 계산 가능

Crc64 crcCalculator = new Crc64();

crcCalculator.Append(data);
Console.WriteLine(crcCalculator.GetCurrentHashAsUInt64()); // 출력 결과: 11672975025148400158

crcCalculator.Append(data);
Console.WriteLine(crcCalculator.GetCurrentHashAsUInt64()); // 출력 결과: 482019136267091975

만약 System.IO.Hashing 어셈블리의 참조를 원하지 않는다면, (CRC32 코드에서와 마찬가지로) Crc64 Class 문서에 있는 소스 코드 링크를 통해 다음과 같이 간단하게 추려낼 수도 있습니다.

internal class SimpleCrc64
{
    private static ReadOnlySpan<ulong> CrcLookup => // 256
        [
            0x0, 0x42F0E1EBA9EA3693, 0x85E1C3D753D46D26, 0xC711223CFA3E5BB5, 0x493366450E42ECDF, 0xBC387AEA7A8DA4C, 0xCCD2A5925D9681F9, 0x8E224479F47CB76A,
            0x9266CC8A1C85D9BE, 0xD0962D61B56FEF2D, 0x17870F5D4F51B498, 0x5577EEB6E6BB820B, 0xDB55AACF12C73561, 0x99A54B24BB2D03F2, 0x5EB4691841135847, 0x1C4488F3E8F96ED4,
            0x663D78FF90E185EF, 0x24CD9914390BB37C, 0xE3DCBB28C335E8C9, 0xA12C5AC36ADFDE5A, 0x2F0E1EBA9EA36930, 0x6DFEFF5137495FA3, 0xAAEFDD6DCD770416, 0xE81F3C86649D3285,
            0xF45BB4758C645C51, 0xB6AB559E258E6AC2, 0x71BA77A2DFB03177, 0x334A9649765A07E4, 0xBD68D2308226B08E, 0xFF9833DB2BCC861D, 0x388911E7D1F2DDA8, 0x7A79F00C7818EB3B,
            0xCC7AF1FF21C30BDE, 0x8E8A101488293D4D, 0x499B3228721766F8, 0xB6BD3C3DBFD506B, 0x854997BA2F81E701, 0xC7B97651866BD192, 0xA8546D7C558A27, 0x4258B586D5BFBCB4,
            0x5E1C3D753D46D260, 0x1CECDC9E94ACE4F3, 0xDBFDFEA26E92BF46, 0x990D1F49C77889D5, 0x172F5B3033043EBF, 0x55DFBADB9AEE082C, 0x92CE98E760D05399, 0xD03E790CC93A650A,
            0xAA478900B1228E31, 0xE8B768EB18C8B8A2, 0x2FA64AD7E2F6E317, 0x6D56AB3C4B1CD584, 0xE374EF45BF6062EE, 0xA1840EAE168A547D, 0x66952C92ECB40FC8, 0x2465CD79455E395B,
            0x3821458AADA7578F, 0x7AD1A461044D611C, 0xBDC0865DFE733AA9, 0xFF3067B657990C3A, 0x711223CFA3E5BB50, 0x33E2C2240A0F8DC3, 0xF4F3E018F031D676, 0xB60301F359DBE0E5,
            0xDA050215EA6C212F, 0x98F5E3FE438617BC, 0x5FE4C1C2B9B84C09, 0x1D14202910527A9A, 0x93366450E42ECDF0, 0xD1C685BB4DC4FB63, 0x16D7A787B7FAA0D6, 0x5427466C1E109645,
            0x4863CE9FF6E9F891, 0xA932F745F03CE02, 0xCD820D48A53D95B7, 0x8F72ECA30CD7A324, 0x150A8DAF8AB144E, 0x43A04931514122DD, 0x84B16B0DAB7F7968, 0xC6418AE602954FFB,
            0xBC387AEA7A8DA4C0, 0xFEC89B01D3679253, 0x39D9B93D2959C9E6, 0x7B2958D680B3FF75, 0xF50B1CAF74CF481F, 0xB7FBFD44DD257E8C, 0x70EADF78271B2539, 0x321A3E938EF113AA,
            0x2E5EB66066087D7E, 0x6CAE578BCFE24BED, 0xABBF75B735DC1058, 0xE94F945C9C3626CB, 0x676DD025684A91A1, 0x259D31CEC1A0A732, 0xE28C13F23B9EFC87, 0xA07CF2199274CA14,
            0x167FF3EACBAF2AF1, 0x548F120162451C62, 0x939E303D987B47D7, 0xD16ED1D631917144, 0x5F4C95AFC5EDC62E, 0x1DBC74446C07F0BD, 0xDAAD56789639AB08, 0x985DB7933FD39D9B,
            0x84193F60D72AF34F, 0xC6E9DE8B7EC0C5DC, 0x1F8FCB784FE9E69, 0x43081D5C2D14A8FA, 0xCD2A5925D9681F90, 0x8FDAB8CE70822903, 0x48CB9AF28ABC72B6, 0xA3B7B1923564425,
            0x70428B155B4EAF1E, 0x32B26AFEF2A4998D, 0xF5A348C2089AC238, 0xB753A929A170F4AB, 0x3971ED50550C43C1, 0x7B810CBBFCE67552, 0xBC902E8706D82EE7, 0xFE60CF6CAF321874,
            0xE224479F47CB76A0, 0xA0D4A674EE214033, 0x67C58448141F1B86, 0x253565A3BDF52D15, 0xAB1721DA49899A7F, 0xE9E7C031E063ACEC, 0x2EF6E20D1A5DF759, 0x6C0603E6B3B7C1CA,
            0xF6FAE5C07D3274CD, 0xB40A042BD4D8425E, 0x731B26172EE619EB, 0x31EBC7FC870C2F78, 0xBFC9838573709812, 0xFD39626EDA9AAE81, 0x3A28405220A4F534, 0x78D8A1B9894EC3A7,
            0x649C294A61B7AD73, 0x266CC8A1C85D9BE0, 0xE17DEA9D3263C055, 0xA38D0B769B89F6C6, 0x2DAF4F0F6FF541AC, 0x6F5FAEE4C61F773F, 0xA84E8CD83C212C8A, 0xEABE6D3395CB1A19,
            0x90C79D3FEDD3F122, 0xD2377CD44439C7B1, 0x15265EE8BE079C04, 0x57D6BF0317EDAA97, 0xD9F4FB7AE3911DFD, 0x9B041A914A7B2B6E, 0x5C1538ADB04570DB, 0x1EE5D94619AF4648,
            0x2A151B5F156289C, 0x4051B05E58BC1E0F, 0x87409262A28245BA, 0xC5B073890B687329, 0x4B9237F0FF14C443, 0x962D61B56FEF2D0, 0xCE73F427ACC0A965, 0x8C8315CC052A9FF6,
            0x3A80143F5CF17F13, 0x7870F5D4F51B4980, 0xBF61D7E80F251235, 0xFD913603A6CF24A6, 0x73B3727A52B393CC, 0x31439391FB59A55F, 0xF652B1AD0167FEEA, 0xB4A25046A88DC879,
            0xA8E6D8B54074A6AD, 0xEA16395EE99E903E, 0x2D071B6213A0CB8B, 0x6FF7FA89BA4AFD18, 0xE1D5BEF04E364A72, 0xA3255F1BE7DC7CE1, 0x64347D271DE22754, 0x26C49CCCB40811C7,
            0x5CBD6CC0CC10FAFC, 0x1E4D8D2B65FACC6F, 0xD95CAF179FC497DA, 0x9BAC4EFC362EA149, 0x158E0A85C2521623, 0x577EEB6E6BB820B0, 0x906FC95291867B05, 0xD29F28B9386C4D96,
            0xCEDBA04AD0952342, 0x8C2B41A1797F15D1, 0x4B3A639D83414E64, 0x9CA82762AAB78F7, 0x87E8C60FDED7CF9D, 0xC51827E4773DF90E, 0x20905D88D03A2BB, 0x40F9E43324E99428,
            0x2CFFE7D5975E55E2, 0x6E0F063E3EB46371, 0xA91E2402C48A38C4, 0xEBEEC5E96D600E57, 0x65CC8190991CB93D, 0x273C607B30F68FAE, 0xE02D4247CAC8D41B, 0xA2DDA3AC6322E288,
            0xBE992B5F8BDB8C5C, 0xFC69CAB42231BACF, 0x3B78E888D80FE17A, 0x7988096371E5D7E9, 0xF7AA4D1A85996083, 0xB55AACF12C735610, 0x724B8ECDD64D0DA5, 0x30BB6F267FA73B36,
            0x4AC29F2A07BFD00D, 0x8327EC1AE55E69E, 0xCF235CFD546BBD2B, 0x8DD3BD16FD818BB8, 0x3F1F96F09FD3CD2, 0x41011884A0170A41, 0x86103AB85A2951F4, 0xC4E0DB53F3C36767,
            0xD8A453A01B3A09B3, 0x9A54B24BB2D03F20, 0x5D45907748EE6495, 0x1FB5719CE1045206, 0x919735E51578E56C, 0xD367D40EBC92D3FF, 0x1476F63246AC884A, 0x568617D9EF46BED9,
            0xE085162AB69D5E3C, 0xA275F7C11F7768AF, 0x6564D5FDE549331A, 0x279434164CA30589, 0xA9B6706FB8DFB2E3, 0xEB46918411358470, 0x2C57B3B8EB0BDFC5, 0x6EA7525342E1E956,
            0x72E3DAA0AA188782, 0x30133B4B03F2B111, 0xF7021977F9CCEAA4, 0xB5F2F89C5026DC37, 0x3BD0BCE5A45A6B5D, 0x79205D0E0DB05DCE, 0xBE317F32F78E067B, 0xFCC19ED95E6430E8,
            0x86B86ED5267CDBD3, 0xC4488F3E8F96ED40, 0x359AD0275A8B6F5, 0x41A94CE9DC428066, 0xCF8B0890283E370C, 0x8D7BE97B81D4019F, 0x4A6ACB477BEA5A2A, 0x89A2AACD2006CB9,
            0x14DEA25F3AF9026D, 0x562E43B4931334FE, 0x913F6188692D6F4B, 0xD3CF8063C0C759D8, 0x5DEDC41A34BBEEB2, 0x1F1D25F19D51D821, 0xD80C07CD676F8394, 0x9AFCE626CE85B507,
        ];

    public static ulong Calc(ReadOnlySpan<byte> source)
    {
        ulong crc = 0;

        ReadOnlySpan<ulong> crcLookup = CrcLookup;

        for (int i = 0; i < source.Length; i++)
        {
            ulong idx = (crc >> 56);
            idx ^= source[i];
            crc = crcLookup[(int)idx] ^ (crc << 8);
        }

        return crc;
    }
}

물론 결과는 원래의 Crc64 클래스와 동일합니다.

byte[] data = System.Text.Encoding.UTF8.GetBytes("Hello, CRC64!");
Console.WriteLine(SimpleCrc64.Calc(data)); // 출력 결과: 11672975025148400158

data = System.Text.Encoding.UTF8.GetBytes("Hello, CRC64!Hello, CRC64!");
Console.WriteLine(SimpleCrc64.Calc(data)); // 출력 결과: 482019136267091975

(첨부 파일은 이 글의 예제 코드를 포함합니다.)




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 10/15/2025]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 136  137  138  [139]  140  141  142  143  144  145  146  147  148  149  150  ...
NoWriterDateCnt.TitleFile(s)
1684정성태6/9/201446643.NET Framework: 442. C# - 시스템의 CPU 사용량 및 프로세스(EXE)의 CPU 사용량 알아내는 방법 [5]파일 다운로드1
1683정성태6/2/201426170오류 유형: 228. CLR4 보안 - yield 구문 내에서 SecurityCritical 메서드 사용 불가 [2]파일 다운로드1
1682정성태6/1/201432656.NET Framework: 441. .NET CLR4 보안 모델 - 3. CLR4 보안 모델에서의 APTCA 역할파일 다운로드2
1681정성태6/1/201426993.NET Framework: 440. .NET CLR4 보안 모델 - 2. 샌드박스(Sandbox)을 이용한 보안 [2]파일 다운로드1
1680정성태6/1/201426525.NET Framework: 439. .NET CLR4 보안 모델 - 1. "Security Level 2"란?파일 다운로드1
1679정성태5/31/201425466.NET Framework: 438. .NET CLR2 보안 모델에서의 APTCA 역할파일 다운로드1
1678정성태5/31/201429249개발 환경 구성: 222. 라이브러리 개발자를 위한 보안 권한 테스트 - "Network Service" 계정 권한으로 실행
1677정성태5/30/201424927VS.NET IDE: 87. IIS Express - 웹 응용 프로그램의 .NET 버전에 맞는 CLR이 로드되지 않는 경우파일 다운로드1
1676정성태5/27/201433212Windows: 95. 윈도우 8에서 Hyper-V 유무에 따른 듀얼 부트 설정하는 방법 [1]
1675정성태5/27/201435663Windows: 94. 윈도우 8.1에서 윈도우 체험 지수(Windows Experience Index, WEI) 확인 방법
1674정성태5/24/201428385VS.NET IDE: 86. 하나의 T4 템플릿으로 여러 개의 소스코드 파일을 자동으로 생성하는 방법 [1]파일 다운로드1
1673정성태5/19/201428676.NET Framework: 437. WACOM 태블릿 환경에서 WinForm 실행시 System.ArgumentException 예외 발생
1672정성태5/15/201429393기타: 46. Microsoft의 응용 프로그램을 클라우드로 제공하는 서비스 - Azure RemoteApp 소개 [2]
1671정성태5/15/201429358.NET Framework: 436. XNA Content 리소스의 해제 후 다시 로드해서 사용하면 ObjectDisposedException 예외 발생 [2]
1670정성태5/15/201430018.NET Framework: 435. .NET GC - 하위 세대의 객체를 포함하는 상위 세대의 참조를 추적하기 위한 card-table
1669정성태5/15/201449844Windows: 93. 윈도우 시스템 디스크 용량 확보를 위한 $PatchCache$ 폴더 삭제 [2]
1668정성태5/10/201428504.NET Framework: 434. Microsoft.SqlServer.Types.SqlGeography 형변환 시 null 반환하는 문제
1667정성태5/5/201429521개발 환경 구성: 221. Azure 데이터베이스를 로컬 DB로 이전하는 방법 [2]
1666정성태5/2/201446478기타: 45. 윈도우 계정의 암호를 알아내는 mimikatz 도구 [5]
1665정성태5/1/201429742.NET Framework: 433. C# - 간단한 HyperLogLog 자료 구조 테스트파일 다운로드1
1664정성태4/28/201427643오류 유형: 227. Process Explorer의 프로세스 뷰가 트리 형식으로 보이지 않는 문제
1663정성태4/28/201423332오류 유형: 226. Visual Studio - We were unable to establish the connection because it is configured for user
1662정성태4/28/201428730개발 환경 구성: 220. supportedRuntime 설정을 위한 app.config Transformation [1]
1661정성태4/26/201424402.NET Framework: 432. WPF - System.Windows.Data Error: 47 : XmlDataProvider has inline XML that does not explicitly set its XmlNamespace (xmlns="").
1660정성태4/25/201432426VC++: 77. C++ 숫자형 값이 범위를 벗어나는 경우의 출력 사례 모음
1659정성태4/17/201433269.NET Framework: 431. .NET EXE 파일을 닷넷 프레임워크 버전에 상관없이 실행할 수 있을까요? [5]
... 136  137  138  [139]  140  141  142  143  144  145  146  147  148  149  150  ...