سؤال

هل هناك تقنية ضغط بسيطة حقا لأسلوتات تصل إلى حوالي 255 حرفا في الطول (نعم، أنا ضغط عناوين URL)?

أنا لست مهتما بقوة الضغط - أبحث عن شيء ينفذ جيدا وسريع التنفيذ. أود أن شيء أبسط من Sharpziplib.: شيء يمكن تنفيذه بضع طرق قصيرة.

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

المحلول

أعتقد أن السؤال الرئيسي هنا هو "لماذا تريد ضغط عناوين URL؟"

محاولة تقصير عناوين URL الطويلة لشريط العناوين؟

كنت أفضل تخزين عنوان URL الأصلي في مكان ما (قاعدة البيانات، الملف النصي ...) إلى جانب HASHCODE من الجزء غير المجال (MD5 جيد). يمكنك بعد ذلك الحصول على صفحة بسيطة (أو بعض httpModule إذا كنت تشعر براقة) لقراءة MD5 والبحث عن عنوان URL الحقيقي. هذه هي الطريقة التي يعمل بها tinyurl وغيرها.

علي سبيل المثال:

http://mydomain.com/folder1/folder2/page1.aspx

يمكن تقصيرها إلى:

http://mydomain.com/2d4f1c8a

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

تخزين الكثير من عناوين URL في الذاكرة أو على القرص؟

استخدم مكتبة ضغط المضمنة داخل System.io.com أو مكتبة ZLIB وهي جيدة بشكل لا يصدق. نظرا لأنك ستتم تخزين البيانات الثنائية سيكون الإخراج المضغوط جيدا كما هو. ستحتاج إلى إلغاء ضغطه لاستخدامه كعرف URL.

نصائح أخرى

كما اقترح في الإجابة المقبولة, ، استخدام ضغط البيانات لا يعمل على تقصير مسارات URL قصيرة إلى حد ما.

dotnetzip. لديه فئة deflatestream تعرض ثابتا (مشترك في VB) ضغط الهواء طريقة. إنها طريقة سطر واحدة لضغط سلسلة باستخدام Dyplate (RFC 1951.). تنفيذ الانفصال متوافق تماما مع system.io.compression.deflatestream, ، ولكن dotnetzip يضغط بشكل أفضل. إليك كيفية استخدامك:

string[] orig = {
    "folder1/folder2/page1.aspx",
    "folderBB/folderAA/page2.aspx",
};
public void Run()
{
    foreach (string s in orig)
    {
        System.Console.WriteLine("original    : {0}", s);
        byte[] compressed = DeflateStream.CompressString(s);
        System.Console.WriteLine("compressed  : {0}", ByteArrayToHexString(compressed));
        string uncompressed = DeflateStream.UncompressString(compressed);
        System.Console.WriteLine("uncompressed: {0}\n", uncompressed);
    }
}

باستخدام هذا الرمز، إليك نتائج الاختبار الخاصة بي:

original    : folder1/folder2/page1.aspx
compressed  : 4bcbcf49492d32d44f03d346fa0589e9a9867a89c5051500
uncompressed: folder1/folder2/page1.aspx

original    : folderBB/folderAA/page2.aspx
compressed  : 4bcbcf49492d7272d24f03331c1df50b12d3538df4128b0b2a00
uncompressed: folderBB/folderAA/page2.aspx

حتى تتمكن من رؤية صفيف البايت "المضغوط"، عند تمثيلها في عرافة، أطول من الأصل، حوالي 2x طالما. السبب هو أن بايت عرافة هو في الواقع 2 ascii chars.

يمكنك تعويض ذلك إلى حد ما باستخدام BASE-62، بدلا من Base-16 (Hex) لتمثيل الرقم. في هذه الحالة AZ و AZ أيضا أرقام، مما يمنحك 0-9 (10) + AZ (+26) + AZ (+26) = 62 إجمالي أرقام. من شأنه أن يقصر الناتج بشكل كبير. أنا لم أحاول ذلك. بعد.


تعديل
حسنا، اختبرت تشفير الأساس 62. يقصر سلسلة عرافة بنحو النصف. لقد احسبت أنها ستقطعها إلى 25٪ (62/16 = ~ 4) لكنني أعتقد أنني أفقد شيئا مع التقدير. في اختباراتي، تعد السلسلة المشفرة الناتجة بين 62 حوالي الطول مثل عنوان URL الأصلي. لذلك، لا، باستخدام ضغط ثم ترميز الأساس 62 لا يزال غير نهج جيد. تريد حقا قيمة التجزئة.

أود أن أقترح النظر في اسم اسم الاسم. وبعد هناك مقال عن CodeProject قد يساعد ذلك.

ما هو هدفك؟

لقد قمت للتو بإنشاء مخطط ضغط يستهدف عناوين URL وتحقق حوالي 50٪ من الضغط (مقارنة بتمثيل Base64 لنص URL الأصلي).

يرى http://blog.alivate.com.au/packed-url/

أود أن أبدأ بمحاولة واحدة من المكتبات الرمز البريدي الحالية (المجانية أو المفتوحة)، على سبيل المثال http://www.icsharpcode.net/opensource/sharpziplib/

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

هل حاولت فقط باستخدام gzip?

لا فكرة عما إذا كان الأمر سيعمل بفعالية مع هذه الأوتار القصيرة، لكنني أقول أنها ربما أفضل رهان.

مكتبة المصدر المفتوحة Sharpziplib. سهل الاستخدام وسوف يوفر لك أدوات ضغط

يمكنك استخدام خوارزمية الانفديل مباشرة، دون أي رؤوس المجموع الاختبارات أو تذييلات، كما هو موضح في هذا السؤال: بيثون: تضخيم وتطبيقات الانفصال

هذا يقطع عنوان URL بحرف 4100 حرفا إلى 1270 حرفا في Base64، في اختباري، مما يتيح لها التوصيل داخل حدود IE في IE.

وهنا مثال على عنوان URL 4000, ، والتي لا يمكن حلها باستخدام hashtable نظرا لأن التطبيق الصغير موجود على أي خادم.

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