@@ -92,14 +92,14 @@ public Guid NextGuid()
9292 // swapping high and low byte, because SQL-server is doing the wrong ordering otherwise
9393 var sequenceSwapped = ( ( sequence << 8 ) | ( ( sequence >> 8 ) & 0x00FF ) ) & 0xFFFF ;
9494
95- #if NET6_0_OR_GREATER
95+ #if NET6_0_OR_GREATER
9696 if ( Ssse3 . IsSupported && BitConverter . IsLittleEndian )
9797 {
9898 var vec = Vector128 . Create ( ( int ) a , b , _c , _d | sequenceSwapped ) ;
9999 var result = Ssse3 . Shuffle ( vec . AsByte ( ) , Vector128 . Create ( ( byte ) 12 , 13 , 14 , 15 , 8 , 9 , 10 , 11 , 5 , 4 , 3 , 2 , 1 , 0 , 7 , 6 ) ) ;
100100 return Unsafe . As < Vector128 < byte > , Guid > ( ref result ) ;
101101 }
102- #endif
102+ #endif
103103
104104 var d = ( byte ) ( b >> 8 ) ;
105105 var e = ( byte ) b ;
@@ -128,9 +128,9 @@ public Guid NextSequentialGuid()
128128 var sequence = _sequence ++ ;
129129
130130 var a = _a ;
131- #if NET6_0_OR_GREATER
131+ #if NET6_0_OR_GREATER
132132 var v = _b ;
133- #endif
133+ #endif
134134 var b = ( short ) ( _b >> 16 ) ;
135135 var c = ( short ) _b ;
136136
@@ -140,14 +140,14 @@ public Guid NextSequentialGuid()
140140 // swapping high and low byte, because SQL-server is doing the wrong ordering otherwise
141141 var sequenceSwapped = ( ( sequence << 8 ) | ( ( sequence >> 8 ) & 0x00FF ) ) & 0xFFFF ;
142142
143- #if NET6_0_OR_GREATER
143+ #if NET6_0_OR_GREATER
144144 if ( Ssse3 . IsSupported && BitConverter . IsLittleEndian )
145145 {
146146 var vec = Vector128 . Create ( ( int ) a , v , _c , _d | sequenceSwapped ) ;
147147 var result = Ssse3 . Shuffle ( vec . AsByte ( ) , Vector128 . Create ( ( byte ) 0 , 1 , 2 , 3 , 6 , 7 , 4 , 5 , 11 , 10 , 9 , 8 , 15 , 14 , 13 , 12 ) ) ;
148148 return Unsafe . As < Vector128 < byte > , Guid > ( ref result ) ;
149149 }
150- #endif
150+ #endif
151151
152152 var d = ( byte ) ( _gc >> 8 ) ;
153153 var e = ( byte ) _gc ;
@@ -190,16 +190,91 @@ public ArraySegment<NewId> Next(NewId[] ids, int index, int count)
190190 return new ArraySegment < NewId > ( ids , index , count ) ;
191191 }
192192
193+ public ArraySegment < Guid > NextGuid ( Guid [ ] ids , int index , int count )
194+ {
195+ if ( index + count > ids . Length )
196+ throw new ArgumentOutOfRangeException ( nameof ( count ) ) ;
197+
198+ var ticks = _tickProvider . Ticks ;
199+
200+ var a = _a ;
201+ var b = _b ;
202+
203+ var lockTaken = false ;
204+ _spinLock . Enter ( ref lockTaken ) ;
205+
206+ if ( ticks > _lastTick )
207+ UpdateTimestamp ( ticks ) ;
208+
209+ var d = ( byte ) ( b >> 8 ) ;
210+ var e = ( byte ) b ;
211+ var f = ( byte ) ( a >> 24 ) ;
212+ var g = ( byte ) ( a >> 16 ) ;
213+ var h = ( byte ) ( a >> 8 ) ;
214+ var i = ( byte ) a ;
215+ var j = ( byte ) ( b >> 24 ) ;
216+ var k = ( byte ) ( b >> 16 ) ;
217+
218+ var limit = index + count ;
219+ for ( var offset = index ; offset < limit ; offset ++ )
220+ {
221+ if ( _sequence == 65535 ) // we are about to rollover, so we need to increment ticks
222+ {
223+ UpdateTimestamp ( _lastTick + 1 ) ;
224+
225+ if ( a != _a )
226+ {
227+ a = _a ;
228+ f = ( byte ) ( a >> 24 ) ;
229+ g = ( byte ) ( a >> 16 ) ;
230+ h = ( byte ) ( a >> 8 ) ;
231+ i = ( byte ) a ;
232+ }
233+
234+ if ( b != _b )
235+ {
236+ b = _b ;
237+ d = ( byte ) ( b >> 8 ) ;
238+ e = ( byte ) b ;
239+ j = ( byte ) ( b >> 24 ) ;
240+ k = ( byte ) ( b >> 16 ) ;
241+ }
242+ }
243+
244+ var sequence = _sequence ++ ;
245+
246+ // swapping high and low byte, because SQL-server is doing the wrong ordering otherwise
247+ var sequenceSwapped = ( ( sequence << 8 ) | ( ( sequence >> 8 ) & 0x00FF ) ) & 0xFFFF ;
248+
249+ #if NET6_0_OR_GREATER
250+ if ( Ssse3 . IsSupported && BitConverter . IsLittleEndian )
251+ {
252+ var vec = Vector128 . Create ( ( int ) a , b , _c , _d | sequenceSwapped ) ;
253+ var result = Ssse3 . Shuffle ( vec . AsByte ( ) , Vector128 . Create ( ( byte ) 12 , 13 , 14 , 15 , 8 , 9 , 10 , 11 , 5 , 4 , 3 , 2 , 1 , 0 , 7 , 6 ) ) ;
254+ ids [ offset ] = Unsafe . As < Vector128 < byte > , Guid > ( ref result ) ;
255+ continue ;
256+ }
257+ #endif
258+
259+ ids [ offset ] = new Guid ( _d | sequenceSwapped , _gb , _gc , d , e , f , g , h , i , j , k ) ;
260+ }
261+
262+ if ( lockTaken )
263+ _spinLock . Exit ( ) ;
264+
265+ return new ArraySegment < Guid > ( ids , index , count ) ;
266+ }
267+
193268 public ArraySegment < Guid > NextSequentialGuid ( Guid [ ] ids , int index , int count )
194269 {
195270 if ( index + count > ids . Length )
196271 throw new ArgumentOutOfRangeException ( nameof ( count ) ) ;
197272
198273 var ticks = _tickProvider . Ticks ;
199274
200- #if NET6_0_OR_GREATER
275+ #if NET6_0_OR_GREATER
201276 var v = _b ;
202- #endif
277+ #endif
203278 var a = _a ;
204279 var b = ( short ) ( _b >> 16 ) ;
205280 var c = ( short ) _b ;
@@ -222,9 +297,9 @@ public ArraySegment<Guid> NextSequentialGuid(Guid[] ids, int index, int count)
222297 {
223298 UpdateTimestamp ( _lastTick + 1 ) ;
224299
225- #if NET6_0_OR_GREATER
300+ #if NET6_0_OR_GREATER
226301 v = _b ;
227- #endif
302+ #endif
228303 a = _a ;
229304 b = ( short ) ( _b >> 16 ) ;
230305 c = ( short ) _b ;
@@ -235,15 +310,15 @@ public ArraySegment<Guid> NextSequentialGuid(Guid[] ids, int index, int count)
235310 // swapping high and low byte, because SQL-server is doing the wrong ordering otherwise
236311 var sequenceSwapped = ( ( sequence << 8 ) | ( ( sequence >> 8 ) & 0x00FF ) ) & 0xFFFF ;
237312
238- #if NET6_0_OR_GREATER
313+ #if NET6_0_OR_GREATER
239314 if ( Ssse3 . IsSupported && BitConverter . IsLittleEndian )
240315 {
241316 var vec = Vector128 . Create ( ( int ) a , v , _c , _d | sequenceSwapped ) ;
242317 var result = Ssse3 . Shuffle ( vec . AsByte ( ) , Vector128 . Create ( ( byte ) 0 , 1 , 2 , 3 , 6 , 7 , 4 , 5 , 11 , 10 , 9 , 8 , 15 , 14 , 13 , 12 ) ) ;
243318 ids [ offset ] = Unsafe . As < Vector128 < byte > , Guid > ( ref result ) ;
244319 continue ;
245320 }
246- #endif
321+ #endif
247322
248323 var h = ( byte ) ( ( _d | sequenceSwapped ) >> 24 ) ;
249324 var i = ( byte ) ( ( _d | sequenceSwapped ) >> 16 ) ;
0 commit comments