طراحی یک دیکشنری کارآمد برای ردیابی آدرس IP با استفاده از AlternateLookup و IAlternateEqualityComparer داتنت 9
نویسنده: وحید نصیری
تاریخ: ۱۴۰۳/۱۲/۲۷ ۰۸:۵۹
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
IAlternateEqualityComparer سفارشی و AlternateLookup را در یک Dictionary (دیکشنری) برای ردیابی کارآمد اطلاعات آدرس IP، با کلیدهای بایتهای آدرس IP، نشان میدهد.Dictionary که با بایتهای آدرس IP، کلید گذاری شدهاست.Dictionary<ReadOnlyMemory<byte>, string> استفاده میشود.ReadOnlyMemory<byte> به عنوان کلید، با یک مقایسه کننده سفارشی (ReadOnlyMemoryComparer).Span<byte> برای نگهداری بایتهای آدرس IP استفاده می شود، از تخصیصهای غیر ضروری جلوگیری میکند.stackalloc یک بافر بایت را در پشته تخصیص میدهد.IPAddress.TryWriteBytes بافر را پر میکند.var ipAddress = IPAddress.Parse("172.100.50.50");
var size = ipAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork ? 4 : 16;
Span<byte> key = stackalloc byte[size];
if (!ipAddress.TryWriteBytes(key, out var bytesWritten))
{
// Should never happen
}
key = key[..bytesWritten];ReadOnlySpan<byte>) برای جستجوی کلید را فراهم میکند.ReadOnlyMemoryComparer هر دو IEqualityComparer<ReadOnlyMemory<byte>> و IAlternateEqualityComparer<ReadOnlySpan<byte>, ReadOnlyMemory<byte>> را پیاده سازی میکند.Equals، GetHashCode و Create است.internal sealed class ReadOnlyMemoryComparer : IEqualityComparer<ReadOnlyMemory<byte>>,
IAlternateEqualityComparer<ReadOnlySpan<byte>, ReadOnlyMemory<byte>>
{
public static IEqualityComparer<ReadOnlyMemory<byte>> Default { get; } = new ReadOnlyMemoryComparer();
public ReadOnlyMemory<byte> Create(ReadOnlySpan<byte> alternate) =>
alternate.ToArray();
public bool Equals(ReadOnlySpan<byte> alternate, ReadOnlyMemory<byte> other) =>
alternate.SequenceEqual(other.Span);
public bool Equals(ReadOnlyMemory<byte> x, ReadOnlyMemory<byte> y) =>
x.Span.SequenceEqual(y.Span);
public int GetHashCode(ReadOnlySpan<byte> alternate)
{
HashCode hc = default;
hc.AddBytes(alternate);
return hc.ToHashCode();
}
public int GetHashCode(ReadOnlyMemory<byte> obj) => GetHashCode(obj.Span);
}dictionary.GetAlternateLookup<ReadOnlySpan<byte>>() متدهایی را برای عملکرد در دیکشنری با استفاده از ReadOnlySpan<byte> فراهم میکند.alternateLookup[buffer] = "Hello, world!"; یک مورد را اضافه میکند.alternateLookup.ContainsKey(buffer); وجود را بررسی میکند.var alternateLookup = dictionary.GetAlternateLookup<ReadOnlySpan<byte>>(); alternateLookup[buffer] = "Hello, world!"; var exists = alternateLookup.ContainsKey(buffer); //true
IPAddress به عنوان کلید.Span<T> میتواند مقادیر کلیدی را بدون تخصیص پشته تجزیه یا تولید کند، مفید است.Span<char> برای جستجو، از تخصیص رشته جلوگیری کنند.