سؤال

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

مثال: email(example@example.org) = id(d41d8cd98f00b204e9800998ecf8427e)

لسوء الحظ، لا بد لي من تمثيل المعرفات كقيم عددية الآن - حتى أتمكن من استخدام واجهة برمجة التطبيقات حيث يمكن أن يكون المعرف عددًا صحيحًا فقط.

أنا الآن أبحث عن طريقة لتشفير المعرف إلى عدد صحيح لإرساله وفك تشفيره مرة أخرى عند الاستلام.كيف أستطيع فعل هذا؟

أفكاري حتى الآن:

  1. convert_uuencode() و convert_uudecode() لتجزئة MD5
  2. استبدل كل حرف من تجزئة MD5 بـ ord() قيمة

أي نهج هو الأفضل؟هل تعرف طرقًا أفضل للقيام بذلك؟

آمل أن تتمكن من مساعدتي.شكرا جزيلا لك مقدما!

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

المحلول

احرص.سيتطلب تحويل MD5s إلى عدد صحيح دعمًا للأعداد الصحيحة الكبيرة (128 بت).من المحتمل أن واجهة برمجة التطبيقات التي تستخدمها لن تدعم سوى الأعداد الصحيحة 32 بت - أو ما هو أسوأ من ذلك، ربما تتعامل مع الرقم الموجود في الفاصلة العائمة.وفي كلتا الحالتين، سيتم سرقة هويتك.إذا كان الأمر كذلك، فإن مجرد تعيين معرف ثانٍ بشكل تعسفي يعد طريقة أفضل بكثير للتعامل مع الأشياء بدلاً من محاولة تحويل MD5 إلى عدد صحيح.

ومع ذلك، إذا كنت بالتأكيد بحيث يمكن لواجهة برمجة التطبيقات (API) التعامل مع الأعداد الصحيحة الكبيرة بشكل تعسفي دون مشاكل، يمكنك فقط تحويل MD5 من رقم سداسي عشري إلى عدد صحيح.على الأرجح أن PHP لا تدعم هذا المدمج، حيث ستحاول تمثيله كعدد صحيح 32 بت أو نقطة عائمة؛ربما ستحتاج إلى استخدام مكتبة PHP GMP لذلك.

نصائح أخرى

هناك أسباب وجيهة، ذكرها آخرون، للقيام بذلك بطريقة مختلفة.

ولكن إذا كان ما تريد القيام به هو تحويل تجزئة md5 إلى ملف سلسلة من الأرقام العشرية (which is what I think you really mean by "represent by an integer", since an md5 is already an integer in string form), and transform it back into the same md5 string:

function md5_hex_to_dec($hex_str)
{
    $arr = str_split($hex_str, 4);
    foreach ($arr as $grp) {
        $dec[] = str_pad(hexdec($grp), 5, '0', STR_PAD_LEFT);
    }
    return implode('', $dec);
}

function md5_dec_to_hex($dec_str)
{
    $arr = str_split($dec_str, 5);
    foreach ($arr as $grp) {
        $hex[] = str_pad(dechex($grp), 4, '0', STR_PAD_LEFT);
    }
    return implode('', $hex);
}

العرض التوضيحي:

$md5 = md5('example@example.com');
echo $md5 . '<br />';  // 23463b99b62a72f26ed677cc556c44e8
$dec = md5_hex_to_dec($md5);
echo $dec . '<br />';  // 0903015257466342942628374306682186817640
$hex = md5_dec_to_hex($dec);
echo $hex;             // 23463b99b62a72f26ed677cc556c44e8

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

بالنسبة لتكثيف 32 بت، يمكن إجراء حل بسيط عن طريق اختيار 4 أزواج سداسية (8 أحرف) من تجزئة MD5، حيث يمثل كل زوج بايت واحد، ثم تحويل ذلك باستخدام intval().

بالنسبة إلى Int 32 بت غير الموقعة:

$inthash = intval(substr(md5($str), 0, 8), 16);

بالنسبة للقيمة الموجبة فقط لـ Int 32 بت الموقعة:

$inthash = intval(substr(md5($str), 0, 8), 16) >> 1;

من المحتمل أن يعمل هذا فقط مع القيم التي تصل إلى 64 بت (8 بايت أو 16 حرفًا) لمعظم الأنظمة الحديثة كما هو مذكور في المستندات.

في نظام يمكنه استيعاب Ints 64 بت، قد تبدو استراتيجية التقسيم التي تستهلك تجزئة MD5 128 بت بالكامل مثل 2 Ints كما يلي:

$hash = md5($str);
$inthash1 = intval(substr($hash, 0, 16), 16);
$inthash2 = intval(substr($hash, 16, 16), 16);

يمكنك استخدام com.hexdec لتحليل السلسلة السداسية العشرية وتخزين الرقم في قاعدة البيانات.

ألا يمكنك فقط إضافة حقل آخر كان بمثابة حقل int للزيادة التلقائية؟

لماذا أورد ()؟ينتج md5 قيمة عادية تبلغ 16 بايت، ويتم تقديمها لك بالصيغة السداسية لسهولة القراءة بشكل أفضل.لذلك لا يمكنك تحويل قيمة 16 بايت إلى عدد صحيح 4 أو 8 بايت دون خسارة.يجب عليك تغيير جزء من الخوارزميات الخاصة بك لاستخدام هذا كمعرف.

ماذا عن:

$float = hexdec(md5('string'));

أو

$int = (integer) (substr(hexdec(md5('string')),0,9)*100000000);

بالتأكيد فرص أكبر للاصطدام ولكنها لا تزال جيدة بما يكفي للاستخدام بدلاً من التجزئة في قاعدة البيانات؟

هتافات،

/مارسين

استخدم عنوان البريد الإلكتروني كاسم ملف لملف مؤقت فارغ في مجلد مشترك، مثل /var/myprocess/example@example.org

ثم اتصل بـ ftok على اسم الملف.سيُرجع ftok معرفًا فريدًا وعددًا صحيحًا.

ومع ذلك، لن يتم ضمان أن تكون فريدة من نوعها، ولكنها ستكون كافية على الأرجح لواجهة برمجة التطبيقات (API) الخاصة بك.

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