77using System . Diagnostics ;
88using System . Linq ;
99using System . Runtime . CompilerServices ;
10+ using System . Runtime . InteropServices ;
1011using System . Text ;
1112using System . Threading . Tasks ;
1213
@@ -34,26 +35,26 @@ public FieldCache(int initialSize = 128, int maxFieldSize = 128)
3435 entries = new Entry [ size ] ;
3536 }
3637
37- public string GetField ( char [ ] buffer , int start , int length )
38+ public string GetField ( ReadOnlySpan < char > buffer )
3839 {
39- if ( length == 0 )
40+ if ( buffer . IsEmpty )
4041 {
4142 return string . Empty ;
4243 }
4344
44- if ( length > maxFieldSize )
45+ if ( buffer . Length > maxFieldSize )
4546 {
46- return new string ( buffer , start , length ) ;
47+ return buffer . ToString ( ) ;
4748 }
4849
49- var hashCode = GetHashCode ( buffer , start , length ) ;
50+ var hashCode = GetHashCode ( buffer ) ;
5051 ref var bucket = ref GetBucket ( hashCode ) ;
5152 int i = bucket - 1 ;
5253 while ( ( uint ) i < ( uint ) entries . Length )
5354 {
5455 ref var entry = ref entries [ i ] ;
5556
56- if ( entry . HashCode == hashCode && entry . Value . AsSpan ( ) . SequenceEqual ( new Span < char > ( buffer , start , length ) ) )
57+ if ( entry . HashCode == hashCode && entry . Value . AsSpan ( ) . SequenceEqual ( buffer ) )
5758 {
5859 return entry . Value ;
5960 }
@@ -70,25 +71,31 @@ public string GetField(char[] buffer, int start, int length)
7071 ref var reference = ref entries [ count ] ;
7172 reference . HashCode = hashCode ;
7273 reference . Next = bucket - 1 ;
73- reference . Value = new string ( buffer , start , length ) ;
74+ reference . Value = buffer . ToString ( ) ;
7475 bucket = count + 1 ;
7576 count ++ ;
7677
7778 return reference . Value ;
7879 }
7980
8081 [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
81- private uint GetHashCode ( char [ ] buffer , int start , int length )
82+ private static uint GetHashCode ( ReadOnlySpan < char > buffer )
8283 {
8384 unchecked
8485 {
86+ #if NET6_0_OR_GREATER
87+ HashCode hash = new ( ) ;
88+ hash . AddBytes ( MemoryMarshal . AsBytes ( buffer ) ) ;
89+ return ( uint ) hash . ToHashCode ( ) ;
90+ #else
8591 uint hash = 17 ;
86- for ( var i = start ; i < start + length ; i ++ )
92+ foreach ( char c in buffer )
8793 {
88- hash = hash * 31 + buffer [ i ] ;
94+ hash = hash * 31 + c ;
8995 }
9096
9197 return hash ;
98+ #endif
9299 }
93100 }
94101
0 commit comments