المعرفات النصية
هذا أحد أكثر الطلبات شيوعًا التي تصلني، لذا سأقدم شرحًا حول استخدام المعرفات النصية.
لا يدعم Isar المعرفات النصية بشكل أصلي، وذلك لسبب وجيه: المعرفات الرقمية أكثر كفاءة وسرعة. خاصةً بالنسبة للروابط (links)، فإن الحمل الإضافي للمعرف النصي كبير جدًا.
أتفهم أنك قد تحتاج أحيانًا إلى تخزين بيانات خارجية تستخدم UUID أو معرفات أخرى غير رقمية. أقترح تخزين المعرف النصي كخاصية في الكائن الخاص بك، واستخدام دالة هاش سريعة لإنشاء عدد صحيح 64 بت يمكن استخدامه كمعرف (Id).
@collection
class User {
String? id;
Id get isarId => fastHash(id!);
String? name;
int? age;
}
بهذه الطريقة تحصل على أفضل ما في العالمين: معرفات رقمية فعالة للروابط، مع إمكانية استخدام المعرفات النصية.
دالة هاش سريعة
من الناحية المثالية، يجب أن تكون دالة الهاش ذات جودة عالية (لا نريد تصادمات) وسريعة. أنصح باستخدام التنفيذ التالي:
/// خوارزمية FNV-1a 64bit محسّنة لنصوص Dart
int fastHash(String string) {
var hash = 0xcbf29ce484222325;
var i = 0;
while (i < string.length) {
final codeUnit = string.codeUnitAt(i++);
hash ^= codeUnit >> 8;
hash *= 0x100000001b3;
hash ^= codeUnit & 0xFF;
hash *= 0x100000001b3;
}
return hash;
}
إذا اخترت دالة هاش مختلفة، فتأكد من أنها تُرجع عددًا صحيحًا 64 بت، وتجنب استخدام دالة هاش مشفرة (cryptographic) لأنها أبطأ بكثير.
:::warning تجنب استخدام string.hashCode لأنه ليس مضمونًا أن يكون ثابتًا عبر المنصات المختلفة وإصدارات Dart. :::
```