Microsoft MVP성태의 닷넷 이야기
닷넷: 2371. C# - CRC64 (System.IO.Hashing의 약식 버전) [링크 복사], [링크+제목 복사],
조회: 601
글쓴 사람
정성태 (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

비밀번호

댓글 작성자
 




... 166  167  168  169  170  171  172  173  [174]  175  176  177  178  179  180  ...
NoWriterDateCnt.TitleFile(s)
769정성태8/25/200931543개발 환경 구성: 49. GAC와 같은 Namespace Extension에 의해서 보여지는 폴더의 원본 확인 방법
768정성태8/24/200931158오류 유형: 85. WCF 연결 오류: MessageSecurityException
767정성태8/23/200938893.NET Framework: 158. 닷넷 프로파일러 - IL 코드 재작성 [14]
766정성태8/23/200940371.NET Framework: 157. C# 4.0 - dynamic 키워드 [4]파일 다운로드1
765정성태8/22/200934116.NET Framework: 156. XamDataGrid의 UnboundField 사용파일 다운로드1
764정성태8/21/200928084Windows: 47. Windows Virtual PC에 설치된 Windows 7 VPC에서 Aero 효과 사용 [3]
763정성태8/20/200931697Windows: 46. Windows 7 - XP 모드 응용 프로그램 바로가기 만드는 방법 [2]
762정성태8/18/200937521개발 환경 구성: 48. 개발자 PC 환경 - 유니코드(Unicode)를 위한 설정 [3]
760정성태8/17/200943766개발 환경 구성: 47. XmlCodeGenerator 1.0.0.4 업데이트 [2]
759정성태8/16/200935857.NET Framework: 155. 닷넷 프로파일러의 또 다른 응용: Visual Studio 2010 Historical Debugging
758정성태8/15/200929090VS.NET IDE: 65. WPF 프로젝트용 Visual Studio 패치들 [2]
757정성태8/12/200928671오류 유형: 84. TFS 작업 항목 보기 오류 - WorkItemTypeDeniedOrNotExistException
756정성태8/9/200927703오류 유형: 83. A revocation check could not be performed for the certificate.
755정성태8/6/200925360.NET Framework: 154. 이벤트 2중 구독
754정성태7/16/200938080VS.NET IDE: 64. Visual Studio 2010 - 64bit 혼합 모드 디버깅 지원
753정성태7/15/200936585.NET Framework: 153. WPF와 WinForm의 Shown 이벤트 시점
752정성태7/14/200932240개발 환경 구성: 46. .NET Service Bus 응용 사례: SocketShifter [2]파일 다운로드1
751정성태7/9/200932765.NET Framework: 152. 순환 참조와 XmlSerializer파일 다운로드1
750정성태7/7/200933686.NET Framework: 151. Team Explorer가 설치되지 않은 PC에서 System.InvalidProgramException 예외 발생파일 다운로드1
748정성태7/2/200933329.NET Framework: 150. WPF - Property Element 사용 의미파일 다운로드2
747정성태7/1/200951109.NET Framework: 149. WPF - UI 업데이트를 바로 반영하고 싶다면? [3]파일 다운로드1
746정성태6/25/200938149.NET Framework: 148. WPF - 데이터 바인딩 시의 예외 처리 방법 [1]파일 다운로드1
745정성태6/22/200929983.NET Framework: 147. WPF - Binding에 Sibling 요소 지정 [2]파일 다운로드1
744정성태6/21/200928546.NET Framework: 146. WPF - 중첩된 ScrollViewer의 크기 제어 [2]파일 다운로드1
743정성태6/17/200932738.NET Framework: 145. Unity Container 개체 풀이
742정성태6/17/200932047.NET Framework: 144. WPF - FrameworkElement.Parent 속성이 null이라면? [3]
... 166  167  168  169  170  171  172  173  [174]  175  176  177  178  179  180  ...