@@ -92,28 +92,46 @@ func (u *UUID) Parse(s string) error {
9292 return nil
9393
9494 case 32 : // hash
95- for i := 0 ; i < 32 ; i += 2 {
96- v1 := hexLookupTable [s [i ]]
97- v2 := hexLookupTable [s [i + 1 ]]
98- if v1 | v2 == 255 {
99- return errInvalidFormat
100- }
101- u [i / 2 ] = (v1 << 4 ) | v2
102- }
95+ // Unrolled hash parsing loop - 16 iterations, 2 chars per byte
96+ v1 := hexLookupTable [s [0 ]]; v2 := hexLookupTable [s [1 ]]; if v1 | v2 == 255 { return errInvalidFormat }; u [0 ] = (v1 << 4 ) | v2
97+ v1 = hexLookupTable [s [2 ]]; v2 = hexLookupTable [s [3 ]]; if v1 | v2 == 255 { return errInvalidFormat }; u [1 ] = (v1 << 4 ) | v2
98+ v1 = hexLookupTable [s [4 ]]; v2 = hexLookupTable [s [5 ]]; if v1 | v2 == 255 { return errInvalidFormat }; u [2 ] = (v1 << 4 ) | v2
99+ v1 = hexLookupTable [s [6 ]]; v2 = hexLookupTable [s [7 ]]; if v1 | v2 == 255 { return errInvalidFormat }; u [3 ] = (v1 << 4 ) | v2
100+ v1 = hexLookupTable [s [8 ]]; v2 = hexLookupTable [s [9 ]]; if v1 | v2 == 255 { return errInvalidFormat }; u [4 ] = (v1 << 4 ) | v2
101+ v1 = hexLookupTable [s [10 ]]; v2 = hexLookupTable [s [11 ]]; if v1 | v2 == 255 { return errInvalidFormat }; u [5 ] = (v1 << 4 ) | v2
102+ v1 = hexLookupTable [s [12 ]]; v2 = hexLookupTable [s [13 ]]; if v1 | v2 == 255 { return errInvalidFormat }; u [6 ] = (v1 << 4 ) | v2
103+ v1 = hexLookupTable [s [14 ]]; v2 = hexLookupTable [s [15 ]]; if v1 | v2 == 255 { return errInvalidFormat }; u [7 ] = (v1 << 4 ) | v2
104+ v1 = hexLookupTable [s [16 ]]; v2 = hexLookupTable [s [17 ]]; if v1 | v2 == 255 { return errInvalidFormat }; u [8 ] = (v1 << 4 ) | v2
105+ v1 = hexLookupTable [s [18 ]]; v2 = hexLookupTable [s [19 ]]; if v1 | v2 == 255 { return errInvalidFormat }; u [9 ] = (v1 << 4 ) | v2
106+ v1 = hexLookupTable [s [20 ]]; v2 = hexLookupTable [s [21 ]]; if v1 | v2 == 255 { return errInvalidFormat }; u [10 ] = (v1 << 4 ) | v2
107+ v1 = hexLookupTable [s [22 ]]; v2 = hexLookupTable [s [23 ]]; if v1 | v2 == 255 { return errInvalidFormat }; u [11 ] = (v1 << 4 ) | v2
108+ v1 = hexLookupTable [s [24 ]]; v2 = hexLookupTable [s [25 ]]; if v1 | v2 == 255 { return errInvalidFormat }; u [12 ] = (v1 << 4 ) | v2
109+ v1 = hexLookupTable [s [26 ]]; v2 = hexLookupTable [s [27 ]]; if v1 | v2 == 255 { return errInvalidFormat }; u [13 ] = (v1 << 4 ) | v2
110+ v1 = hexLookupTable [s [28 ]]; v2 = hexLookupTable [s [29 ]]; if v1 | v2 == 255 { return errInvalidFormat }; u [14 ] = (v1 << 4 ) | v2
111+ v1 = hexLookupTable [s [30 ]]; v2 = hexLookupTable [s [31 ]]; if v1 | v2 == 255 { return errInvalidFormat }; u [15 ] = (v1 << 4 ) | v2
103112 return nil
104113
105114 case 36 : // canonical
106115 if s [8 ] != '-' || s [13 ] != '-' || s [18 ] != '-' || s [23 ] != '-' {
107116 return fmt .Errorf ("uuid: incorrect UUID format in string %q" , s )
108117 }
109- for i , x := range canonicalByteRange {
110- v1 := hexLookupTable [s [x ]]
111- v2 := hexLookupTable [s [x + 1 ]]
112- if v1 | v2 == 255 {
113- return errInvalidFormat
114- }
115- u [i ] = (v1 << 4 ) | v2
116- }
118+ // Unrolled canonical parsing loop - canonicalByteRange: [0, 2, 4, 6, 9, 11, 14, 16, 19, 21, 24, 26, 28, 30, 32, 34]
119+ v1 := hexLookupTable [s [0 ]]; v2 := hexLookupTable [s [1 ]]; if v1 | v2 == 255 { return errInvalidFormat }; u [0 ] = (v1 << 4 ) | v2
120+ v1 = hexLookupTable [s [2 ]]; v2 = hexLookupTable [s [3 ]]; if v1 | v2 == 255 { return errInvalidFormat }; u [1 ] = (v1 << 4 ) | v2
121+ v1 = hexLookupTable [s [4 ]]; v2 = hexLookupTable [s [5 ]]; if v1 | v2 == 255 { return errInvalidFormat }; u [2 ] = (v1 << 4 ) | v2
122+ v1 = hexLookupTable [s [6 ]]; v2 = hexLookupTable [s [7 ]]; if v1 | v2 == 255 { return errInvalidFormat }; u [3 ] = (v1 << 4 ) | v2
123+ v1 = hexLookupTable [s [9 ]]; v2 = hexLookupTable [s [10 ]]; if v1 | v2 == 255 { return errInvalidFormat }; u [4 ] = (v1 << 4 ) | v2
124+ v1 = hexLookupTable [s [11 ]]; v2 = hexLookupTable [s [12 ]]; if v1 | v2 == 255 { return errInvalidFormat }; u [5 ] = (v1 << 4 ) | v2
125+ v1 = hexLookupTable [s [14 ]]; v2 = hexLookupTable [s [15 ]]; if v1 | v2 == 255 { return errInvalidFormat }; u [6 ] = (v1 << 4 ) | v2
126+ v1 = hexLookupTable [s [16 ]]; v2 = hexLookupTable [s [17 ]]; if v1 | v2 == 255 { return errInvalidFormat }; u [7 ] = (v1 << 4 ) | v2
127+ v1 = hexLookupTable [s [19 ]]; v2 = hexLookupTable [s [20 ]]; if v1 | v2 == 255 { return errInvalidFormat }; u [8 ] = (v1 << 4 ) | v2
128+ v1 = hexLookupTable [s [21 ]]; v2 = hexLookupTable [s [22 ]]; if v1 | v2 == 255 { return errInvalidFormat }; u [9 ] = (v1 << 4 ) | v2
129+ v1 = hexLookupTable [s [24 ]]; v2 = hexLookupTable [s [25 ]]; if v1 | v2 == 255 { return errInvalidFormat }; u [10 ] = (v1 << 4 ) | v2
130+ v1 = hexLookupTable [s [26 ]]; v2 = hexLookupTable [s [27 ]]; if v1 | v2 == 255 { return errInvalidFormat }; u [11 ] = (v1 << 4 ) | v2
131+ v1 = hexLookupTable [s [28 ]]; v2 = hexLookupTable [s [29 ]]; if v1 | v2 == 255 { return errInvalidFormat }; u [12 ] = (v1 << 4 ) | v2
132+ v1 = hexLookupTable [s [30 ]]; v2 = hexLookupTable [s [31 ]]; if v1 | v2 == 255 { return errInvalidFormat }; u [13 ] = (v1 << 4 ) | v2
133+ v1 = hexLookupTable [s [32 ]]; v2 = hexLookupTable [s [33 ]]; if v1 | v2 == 255 { return errInvalidFormat }; u [14 ] = (v1 << 4 ) | v2
134+ v1 = hexLookupTable [s [34 ]]; v2 = hexLookupTable [s [35 ]]; if v1 | v2 == 255 { return errInvalidFormat }; u [15 ] = (v1 << 4 ) | v2
117135 return nil
118136
119137 default :
0 commit comments