240 lines
6.1 KiB
Markdown
240 lines
6.1 KiB
Markdown
# Product Encoding System
|
|
|
|
## Overview
|
|
|
|
This document describes the hex-based encoding system for creating stable, bookmarkable URLs for product configurations. The system uses bit-packing to create compact strings that encode product type, color, material, and hardware options.
|
|
|
|
## Design Goals
|
|
|
|
1. **Stable URLs**: Old bookmarks continue to work even as new options are added
|
|
2. **Compact**: Keep URLs under 32-64 characters
|
|
3. **Extensible**: Reserve space for future expansion
|
|
4. **Reversible**: Each encoded string can be uniquely decoded back to its components
|
|
5. **Version-aware**: Support future format changes without breaking old URLs
|
|
|
|
## Encoding Format
|
|
|
|
```
|
|
Format: v-T-C-M-HHHH-HHHH-HHHH
|
|
│ │ │ │ │ │ └── Hardware 3 (optional)
|
|
│ │ │ │ │ └─────── Hardware 2 (optional)
|
|
│ │ │ │ └──────────── Hardware 1
|
|
│ │ │ └────────────── Material (1 hex char, 0-F)
|
|
│ │ └──────────────── Color (1 hex char, 0-F)
|
|
│ └────────────────── Type (1 hex char, 0-F)
|
|
└──────────────────── Version (1 hex char, 0-F)
|
|
|
|
Example: "0-1-4-1-0D94"
|
|
- Version: 0 (using 5-bit encoding per field)
|
|
- Type: 1 (Patio Door)
|
|
- Color: 4 (White)
|
|
- Material: 1 (Aluminum)
|
|
- Hardware 1: 0D94 (Lever, Standard, Brass)
|
|
|
|
Max Length: ~24 characters (with 3 hardware items)
|
|
```
|
|
|
|
## Version 0 Encoding (Current)
|
|
|
|
### Main Product Attributes (Single Hex Character Each)
|
|
|
|
Each main attribute uses a single hex character (0-F = 0-15):
|
|
|
|
#### Type Values (1 hex char)
|
|
```
|
|
1 = Patio Door
|
|
2 = Reserved
|
|
3 = Storm Door
|
|
4 = Reserved
|
|
5 = Storm Window
|
|
6 = Reserved
|
|
7 = Primary Window
|
|
8-F = Reserved (8 slots for future door/window types)
|
|
```
|
|
|
|
#### Color Values (1 hex char)
|
|
```
|
|
1 = Black
|
|
2 = Bronze
|
|
3 = Sandstone
|
|
4 = White
|
|
5 = Tan
|
|
6 = Mill
|
|
7-F = Reserved (9 slots for future colors)
|
|
```
|
|
|
|
#### Material Values (1 hex char)
|
|
```
|
|
1 = Aluminum
|
|
2 = Vinyl
|
|
3-F = Reserved (13 slots for future materials)
|
|
```
|
|
|
|
### Hardware Encoding (4 Hex Characters = FFFF)
|
|
|
|
Each hardware item uses **4 hex characters** (16 bits) split into fields using **5 bits per field**:
|
|
|
|
```
|
|
16 bits total:
|
|
- Bits 10-14: Type (5 bits, 0-31 values)
|
|
- Bits 5-9: Style (5 bits, 0-31 values)
|
|
- Bits 0-4: Color (5 bits, 0-31 values)
|
|
- Bit 15: Reserved (1 bit)
|
|
```
|
|
|
|
#### Hardware Type Values (5 bits = 0-31)
|
|
```
|
|
0 = None/Not Set
|
|
1 = Lever
|
|
2 = Pull
|
|
3 = Pull Handle
|
|
4 = Deadbolt
|
|
5 = Hinge
|
|
6-31 = Reserved (26 slots)
|
|
```
|
|
|
|
#### Hardware Style Values (5 bits = 0-31)
|
|
```
|
|
0 = None/Not Set
|
|
1 = Standard
|
|
2 = Push
|
|
3 = Alternative
|
|
4 = Contemporary
|
|
5 = Traditional
|
|
6-31 = Reserved (26 slots)
|
|
```
|
|
|
|
#### Hardware Color Values (5 bits = 0-31)
|
|
```
|
|
0 = None/Not Set
|
|
1 = Brass
|
|
2 = White
|
|
3 = Black
|
|
4 = Satin
|
|
5 = Nickel
|
|
6 = Bronze
|
|
7-31 = Reserved (25 slots)
|
|
```
|
|
|
|
## Bit Math Examples
|
|
|
|
### Encoding Hardware
|
|
|
|
```
|
|
Example: Lever, Standard, Brass
|
|
- Type: 1 (Lever)
|
|
- Style: 1 (Standard)
|
|
- Color: 1 (Brass)
|
|
|
|
Binary calculation:
|
|
Type (1) = 00001 (bits 10-14)
|
|
Style (1) = 00001 (bits 5-9)
|
|
Color (1) = 00001 (bits 0-4)
|
|
|
|
Combined: 0000010000100001 = 0x0421
|
|
Hex: "0421"
|
|
```
|
|
|
|
```
|
|
Example: Pull Handle, Alternative, Satin
|
|
- Type: 3 (Pull Handle)
|
|
- Style: 3 (Alternative)
|
|
- Color: 4 (Satin)
|
|
|
|
Binary calculation:
|
|
Type (3) = 00011 (bits 10-14)
|
|
Style (3) = 00011 (bits 5-9)
|
|
Color (4) = 00100 (bits 0-4)
|
|
|
|
Combined: 0000110001100100 = 0x0C64
|
|
Hex: "0C64"
|
|
```
|
|
|
|
### Decoding Hardware
|
|
|
|
```
|
|
Given hex: "0D94"
|
|
Binary: 0000110110010100
|
|
|
|
Extract fields:
|
|
Type = bits 10-14 = 00011 = 3 (Pull Handle)
|
|
Style = bits 5-9 = 01100 = 12
|
|
Color = bits 0-4 = 10100 = 20
|
|
```
|
|
|
|
## URL Examples
|
|
|
|
### Simple Products (No Hardware)
|
|
|
|
```
|
|
"0-1-4-1" = Patio Door, White, Aluminum
|
|
"0-3-4-1" = Storm Door, White, Aluminum
|
|
"0-7-1-1" = Primary Window, Black, Aluminum
|
|
"0-5-2-2" = Storm Window, Bronze, Vinyl
|
|
```
|
|
|
|
### Products with Hardware
|
|
|
|
```
|
|
"0-3-4-1-0421" = Storm Door, White, Aluminum, Lever-Standard-Brass
|
|
"0-3-1-1-0421-0C64" = Storm Door, Black, Aluminum,
|
|
Hardware1: Lever-Standard-Brass,
|
|
Hardware2: Pull Handle-Alternative-Satin
|
|
```
|
|
|
|
## Expansion Strategy
|
|
|
|
### Adding New Options (Compatible)
|
|
|
|
When adding new options within existing capacity (0-15 for main attributes, 0-31 for hardware fields):
|
|
|
|
```
|
|
Old system: Color 1-6 defined, 7-15 reserved
|
|
New system: Add Color 7 = Charcoal
|
|
|
|
Old URLs still work: "0-1-4-1" still means Patio Door, White, Aluminum
|
|
New URLs use new values: "0-1-7-1" means Patio Door, Charcoal, Aluminum
|
|
```
|
|
|
|
### Version 1 (Future Expansion)
|
|
|
|
If we exceed 16 main attribute values or 32 hardware field values:
|
|
|
|
```
|
|
Version 1: Use 6 bits per hardware field (64 values each)
|
|
Format: "1-TT-CC-MM-HHHHH-HHHHH"
|
|
|
|
Changes:
|
|
- Main attributes expand to 2 hex chars each (256 values)
|
|
- Hardware expands to 5 hex chars each (18 bits = 6 bits per field)
|
|
```
|
|
|
|
## Compatibility Rules
|
|
|
|
1. **Never reuse reserved values** until a new version is released
|
|
2. **Never change existing value meanings** (e.g., don't make "1" mean something else)
|
|
3. **Always decode based on version character**
|
|
4. **Maintain lookup tables** for each version
|
|
|
|
## Implementation Notes
|
|
|
|
- Use bit-shifting operators (`<<`, `>>`) for performance
|
|
- Use bitwise AND (`&`) with masks to extract fields
|
|
- Pad hex strings with leading zeros to fixed width
|
|
- Validate decoded values against valid ranges
|
|
- Return error for unknown version codes
|
|
|
|
## Benefits
|
|
|
|
✅ **Stable**: Values 0-15 remain the same even if we expand to 0-31
|
|
✅ **Compact**: 13-24 characters for most products
|
|
✅ **Readable**: Hex is human-debuggable
|
|
✅ **Efficient**: Single parse operation, no string splitting
|
|
✅ **Extensible**: Version prefix allows future format changes
|
|
✅ **Reliable**: Bit operations are deterministic and reversible
|
|
|
|
---
|
|
|
|
**Last Updated**: March 26, 2026
|
|
**Current Version**: 0 (5-bit hardware encoding)
|