[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CBT6AEARF1WZDHM66RKTS0":3,"skill-same:01M6CBT6AEARF1WZDHM66RKTS0":44},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":21,"frontMatter":22,"refName":23,"commitSha":24,"skillDirectory":25,"forksCount":13,"repositoryHtmlUrl":26,"repositoryHomepageUrl":6,"ownerHtmlUrl":27,"ownerBlogUrl":6,"ownerDescription":28,"updatedAt":29,"install":30,"resources":43},"01M6CBT6AEARF1WZDHM66RKTS0","36-variable-bigint-rank-key",null,"devwinsoft\u002Fdevian","devwinsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F22570160?v=4","01M6C6RR8W05NH8NPKQNCE3Q72","maoshy","01M6C6RRDJ5TJJCZXRTY801YDH",0,"MIT","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F10-module\u002F20-core\u002F36-variable-bigint-rank-key\u002FSKILL.md",[],[18],"36 variable bigint rank key","2026-11-10 10:12:30",false,"# Devian v11 — Feature: CBigInt.RankKey\n\nStatus: ACTIVE\nAppliesTo: v10\n\n## Purpose\n\nCBigInt → long rank key 변환. 플랫폼 리더보드(GPGS\u002FApple)에 long 하나로 점수를 전달할 때 사용한다.\n\n핵심: **정렬 순서 보존**이 목적이다. 실제 값 복원 목적이 아니다.\n\n---\n\n## 설계 원칙\n\n1. **순서 보존**: `a.CompareTo(b)` 결과와 `a.RankKey.CompareTo(b.RankKey)` 결과가 항상 동일해야 한다.\n2. **정규화 전제**: 인코딩 전 반드시 정규화 상태를 보장한다 (`1 \u003C= abs(mBase) \u003C 10`).\n3. **부호 구간 분리**: `negative key \u003C 0 = zero key \u003C positive key`.\n4. **오버플로 보호**: mPow가 허용 범위를 벗어나면 clamp 처리한다.\n\n---\n\n## 인코딩 구조 (packed long)\n\nCBigInt의 비교 규칙(sign → mPow → mBase)을 그대로 long에 packing한다.\n\n```\nkey = sign × (1 + biasedPow × MANTISSA_SCALE + mantissaBucket)\n```\n\n### 구성 요소\n\n| 요소 | 공식 | 범위 |\n|------|------|------|\n| `mantissaBucket` | `floor((abs(mBase) - 1) × MANTISSA_PRECISION)` | 0 ~ 8,999,999 |\n| `biasedPow` | `mPow + POW_BIAS` | 0 ~ 2 × POW_BIAS |\n| `magnitudeKey` | `biasedPow × MANTISSA_SCALE + mantissaBucket` | 0 ~ max |\n\n### 부호별 변환\n\n| 부호 | key | 보장 |\n|------|-----|------|\n| 양수 | `+(1 + magnitudeKey)` | always >= 1 |\n| 0 | `0` | 고정 |\n| 음수 | `-(1 + magnitudeKey)` | always \u003C= -1 |\n\n음수 구간에서 절대값이 클수록 magnitudeKey가 크고, 부호 반전으로 key가 더 작아진다.\n따라서 -100 \u003C -10 정렬이 보존된다.\n\n---\n\n## 인코딩 상수\n\n| 상수 | 값 | 근거 |\n|------|-----|------|\n| `MantissaPrecision` | 1,000,000 | 소수점 이하 6자리 정밀도 |\n| `MantissaScale` | 10,000,000 | mantissaBucket 최대값(8,999,999)보다 큰 10^7 |\n| `PowBias` | 1,000,000 | mPow 범위 ±100만 커버 (게임 경제 충분) |\n\n### 오버플로 검증\n\n- max magnitudeKey = 2,000,000 × 10,000,000 + 8,999,999 ≈ 2 × 10^13\n- max key = 1 + 2 × 10^13 ≈ 2 × 10^13\n- `long.MaxValue` ≈ 9.2 × 10^18 → **충분한 여유**\n- mPow가 ±PowBias 범위를 벗어나면 clamp (`long.MaxValue` \u002F `long.MinValue`)\n\n---\n\n## Public API\n\n```csharp\n\u002F\u002F CBigInt struct 내부\npublic long RankKey { get; }\npublic static CBigInt FromRankKey(long rankKey);\n```\n\n### RankKey (CBigInt → long)\n- 0이면 `0L` 반환\n- 정규화 후 인코딩 (private `NormalizeRaw` 재활용)\n- mPow 범위 초과 시 양수면 `long.MaxValue`, 음수면 `long.MinValue`로 clamp\n\n### FromRankKey (long → CBigInt)\n- `0` → `CBigInt.Zero`\n- 양수: `magnitudeKey = rankKey - 1` → biasedPow\u002FmantissaBucket 분리 → mPow\u002FmBase 복원\n- 음수: `magnitudeKey = -(rankKey + 1)` → 동일 역변환 후 mBase 부호 반전\n- 정밀도: mantissa 6자리 (float ~7자리와 거의 동일)\n\n---\n\n## NDJSON\u002Fpb64 저장\n\n`class:CBigInt` 타입의 테이블 필드는 NDJSON\u002Fpb64에 **rankKey (long)** 값으로 저장된다.\n\n- 빌드 시: XLSX 셀 → base\u002Fpow 파싱 → `computeCBigIntRankKey()` → long 저장\n- 로드 시: long → `CBigInt.FromRankKey(long)` → CBigInt 복원\n- `CBigIntRankKeyConverter` (JsonConverter)가 자동 변환 처리\n\n---\n\n## 테스트 케이스 (필수)\n\n| 카테고리 | 케이스 |\n|----------|--------|\n| 기본 비교 | 양수끼리 mPow 다름 \u002F 양수끼리 mPow 같고 mBase 다름 |\n| 음수 정렬 | 절대값 큰 음수가 더 작은 key |\n| 부호 경계 | negative \u003C zero \u003C positive |\n| 경계값 | `0`, `{1,0}`, `{9.999,0}`, `{1,-1}`, `{9.9,999999}` |\n| 정규화 동치 | `{55,5}` == `{5.5,6}` → 동일 key |\n| 오버플로 | mPow > PowBias → `long.MaxValue` |\n| 랜덤 샘플 | 수천 쌍 생성 후 `CompareTo` vs `RankKey` 비교 일치 검증 |\n\n---\n\n## Related\n\n- [35-variable-bigint](..\u002F35-variable-bigint\u002FSKILL.md) — CBigInt 본체\n- Implementation: `framework-cs\u002Fmodule\u002FDevian\u002Fsrc\u002FVariable\u002FCBigInt.cs`\n",{},"main","8cb5bd877a3a7004867d2f55697cb9e4ff2f1734","skills\u002Fdevian\u002F10-module\u002F20-core\u002F36-variable-bigint-rank-key","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian","https:\u002F\u002Fgithub.com\u002Fdevwinsoft","Kim Hyong Joon","2026-04-12 18:44:10",{"source":7,"skillName":5,"commands":31,"prompt":41,"zipAvailable":42},[32,35,38],{"tool":33,"command":34},"npx","npx skills add devwinsoft\u002Fdevian --skill 36-variable-bigint-rank-key",{"tool":36,"command":37},"bunx","bunx skills add devwinsoft\u002Fdevian --skill 36-variable-bigint-rank-key",{"tool":39,"command":40},"pnpm","pnpm dlx skills add devwinsoft\u002Fdevian --skill 36-variable-bigint-rank-key","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F10-module\u002F20-core\u002F36-variable-bigint-rank-key\u002FSKILL.md",true,[],[45,51,59,67,76,83],{"skillNo":46,"name":47,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":48,"categories":49,"keywords":50,"publishedAt":19},"01M6CBX3K2JJV38ANHVGCAT8A0","devian","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002FSKILL.md",[],[47],{"skillNo":52,"name":53,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":54,"categories":55,"keywords":56,"publishedAt":19},"01M6CBX210BFMM8AMN770J9WY8","90-project-archive","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F90-project-archive\u002FSKILL.md",[],[57,58],"archive","90 project archive",{"skillNo":60,"name":61,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":62,"categories":63,"keywords":64,"publishedAt":19},"01M6CBWZSGRR9R3YJZB3177667","30-env-management","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F30-env-management\u002FSKILL.md",[],[65,66],"management","30 env management",{"skillNo":68,"name":69,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":70,"categories":71,"keywords":72,"publishedAt":19},"01M6CBWYD3TGWBQV7V35551THF","19-page-push-send","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F19-page-push-send\u002FSKILL.md",[],[73,74,75],"push","page","19 page push send",{"skillNo":77,"name":78,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":79,"categories":80,"keywords":81,"publishedAt":19},"01M6CBWWRQ05A7604GHJKTPJTF","18-page-savedata","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F18-page-savedata\u002FSKILL.md",[],[74,82],"18 page savedata",{"skillNo":84,"name":85,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":86,"categories":87,"keywords":88,"publishedAt":19},"01M6CBWVH4S2VF1V7B2GBTESCT","17-page-deobfuscate","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F17-page-deobfuscate\u002FSKILL.md",[],[74,89],"17 page deobfuscate"]