File size: 1,171 Bytes
68f7925
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// 選択データのハッシュを生成する関数
export function generateSelectionHash(data: unknown): string {
  // データを正規化してからハッシュを生成
  const normalizedData = normalizeForHashing(data);
  return Buffer.from(JSON.stringify(normalizedData)).toString('base64').slice(0, 16);
}

// ハッシュ生成用にデータを正規化する関数
function normalizeForHashing(data: unknown): unknown {
  if (data === null || data === undefined) {
    return data;
  }
  
  if (Array.isArray(data)) {
    return data.map(normalizeForHashing).sort(); // 配列はソートして安定化
  }
  
  if (typeof data === 'object') {
    const normalized: Record<string, unknown> = {};
    // オブジェクトのキーをソートして安定化
    const sortedKeys = Object.keys(data).sort();
    for (const key of sortedKeys) {
      normalized[key] = normalizeForHashing((data as Record<string, unknown>)[key]);
    }
    return normalized;
  }
  
  return data;
}

// キャッシュキーを生成する関数
export function createCacheKey(prefix: string, data: unknown): string {
  return `${prefix}_${generateSelectionHash(data)}`;
}