سؤال

وأنا أحاول أن أفهم CRC32 لتوليد رابط فريدة من نوعها لصفحة الويب.

إذا نستخدم CRC32، ما هو الحد الأقصى لعدد عناوين يمكن أن تستخدم حتى نتمكن من تجنب التكرار؟

وماذا يمكن أن يكون طول سلسلة بالتقريب للحفاظ على الاختباري هو 2 ^ 32؟

وعندما حاولت UUID لرابط وتحويل بايت UUID إلى قاعدة 64، I يمكن أن تقلل إلى 22 حرف طويلة. وأتساءل أنا يمكن أن تقلل بشكل أكبر.

ومعظمهم أريد تحويل رابط (بحد أقصى 1024 حرف) إلى معرف قلل.

هل كانت مفيدة؟

المحلول

وليس هناك مثل هذا العدد باسم "الحد الأقصى لعدد عناوين يمكن استخدامها حتى نتمكن من تجنب التكرار" لCRC32.

والمشكلة هي أن CRC32 يمكن أن تنتج التكرارات، وانها ليست وظيفة عن عدد القيم التي رمي في ذلك، انها وظيفة ما تبدو تلك القيم مثل.

وهكذا قد يكون لديك تصادم على رابط الثاني، إذا كنت سيئ الحظ.

ويجب أن لا قاعدة الخوارزمية الخاصة بك على إنتاج تجزئة فريدة من نوعها، بدلا إنتاج قيمة فريدة لكل رابط يدويا.

نصائح أخرى

إذا كنت تخزين بالفعل URL الكامل في جدول قاعدة بيانات، معرف عدد صحيح قصير جدا، ويمكن أن يتم أقصر بتحويله إلى قاعدة 16، 64، أو 85. إذا كنت تستطيع استخدام UUID، يمكنك استخدام عدد صحيح، ويمكنك كذلك، لأنه أقصر وأنا لا أرى ما تستفيد من شأنه أن يوفر UUID في جدول البحث الخاص بك.

والطريقة الصحيحة لجعل URL قصيرة هي لتخزين واحد كامل في قاعدة البيانات ونشر شيء أن يعين مؤشر التوالي. وهناك طريقة المضغوط هو استخدام باستخدام Base64 معرف صف واحد، على سبيل المثال. أو هل يمكن استخدام UID للمفتاح الأساسي وإظهار ذلك.

لا تستخدم الاختباري، لأنه صغير جدا، ومن المرجح جدا أن الصراع. تجزئة التشفير أكبر وأقل احتمالا، لكنه ما زال يست الطريقة الصحيحة للذهاب.

وسائل CRC32 <م> فحص دوري التكرار مع 32 بت حيث لخص أي مبلغ التعسفي من بت ما يصل الى مبلغ الشيك 32 بت. وظائف الاختيار مبلغ هي surjective، وهذا يعني قيم الإدخال متعددة لها قيمة الانتاج نفسها. لذلك لا يمكنك معكوس الدالة.

لا، حتى كنت تستخدم md5، أو أي مبلغ الشيك الآخر، وURL يستطيع كنت مكررة، كل هذا يتوقف على حظك.

وحتى لا تجعل قاعدة رابط فريدة من نوعها على تلك الاختيار مبلغ

وأسرع (وربما أفضل!) وسيلة لحل الأمور قد تكون لمجرد استخدام تجزئة المسار المحلي والاستعلام من URI معينة، كما يلي:

using System;

namespace HashSample
{
    class Program
    {
        static void Main(string[] args)
        {
            Uri uri = new Uri(
                "http://host.com/folder/file.jpg?code=ABC123");

            string hash = GetPathAndQueryHash(uri);

            Console.WriteLine(hash);
        }

        public static string GetPathAndQueryHash(Uri uri)
        {
            return uri.PathAndQuery.GetHashCode().ToString();
        }
    }
}

ما سبق يفترض أن المخطط URI والمضيف لا تزال هي نفسها. إن لم يكن GetHashCode ستعمل مع أي سلسلة.

لمناقشة كبيرة حول زيارة CRC32 تجزئة اصطدام: <لأ href = "http://episteme.arstechnica.com/eve/forums/a/tpc/f/6330927813/m/821008399831" يختلط = "نوفولو noreferrer" > http://episteme.arstechnica.com/eve/forums/a/tpc/f/6330927813/m/821008399831

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top