Bir tamsayı olarak MD5 hash temsil

8 Cevap php

Benim kullanıcı veritabanı tablosunda, ben kimliği olarak bir kullanıcının e-posta adresi MD5 hash alır.

Örnek: E-posta (example@example.org) = id (d41d8cd98f00b204e9800998ecf8427e)

Id tek bir tamsayı olabilir bir API kullanmak edebilmek için - Ne yazık ki, ben şimdi tamsayı değerler olarak kimlikleri temsil etmek zorunda.

Şimdi alırken yine decode göndermek üzere bir tamsayı id kodlamak için bir yol arıyorum. Bunu nasıl yapabilir?

Şimdiye kadar benim fikirlerim:

  1. convert_uuencode () ve convert_uudecode () MD5 hash için
  2. Onun Ord () değeri ile MD5 hash her karakteri değiştirmek

Hangi yaklaşım daha iyi? Bunu yapmak için daha iyi yollar biliyor musunuz?

Bana yardımcı olur umarım. Şimdiden çok teşekkür ederiz!

8 Cevap

Dikkatli olun. Bir tamsayı MD5s dönüştürme büyük (128-bit) tamsayılar için destek gerektirecektir. Ya da daha kötüsü, kayan nokta sayısı ile ilgili olabilir - şansını kullanmakta olduğunuz API sadece 32-bit tamsayı destekleyecek vardır. Her iki şekilde de, kimlik munged alacak. Bu durumda, sadece ikinci bir kimliği atama keyfi bir tamsayı MD5 dönüştürmek için çalışırken daha şeylerle uğraşmak çok daha iyi bir yoldur.

Eğer sure API sorun olmadan keyfi büyük tamsayılar ile başa çıkabilirim eğer Ancak, sadece onaltılık bir tamsayı MD5 dönüştürebilirsiniz. Bir 32-bit tamsayı ya da bir kayan nokta olarak ya da temsil etmek için çalışacağım gibi PHP, büyük olasılıkla, bu yerleşik ancak desteklemiyor; muhtemelen bunun için PHP GMP library kullanmanız gerekir.

Bunu farklı bir şekilde yapmak için başkaları tarafından belirtilen iyi nedenleri vardır.

But if what you want to do is convert an md5 hash into a string of decimal digits (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);
}

Demo:

$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

Tabii ki, sen dizeleri doğru uzunlukları, vb vardır sağlanması, öndeki sıfırları kaybetmemek için yalnızca dize türü olarak kullanmak için emin gibi, ya dize kullanırken dikkatli olmak lazım

Sen hexdec onaltılık dizeyi ayrıştırmak ve veritabanında numarayı saklamak için kullanabilirsiniz.

Sadece bir otomatik artım int alan bir başka alan eklemek değil misiniz?

Neden ord ()? md5 daha iyi okunabilmesi için onaltılık size sunulan, normal 16-bayt bir değer üretmek. Yani kaybı olmadan 4 veya 8 bayt tamsayı 16-bayt değere dönüştürmek olamaz. Sen id olarak kullanmak için algoritmaların kısmını değiştirmeniz gerekir.

ne:

$ Şamandıra = hexdec (md5 ('string'));

veya

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

Definietly bigger chances fveya collision but still good enaugh to use instead of hash in DB though?

, şerefe

/ Marcin

Paylaşılan bir klasörde boş, geçici dosya dosya adı olarak e-posta adresini kullanın, / var / myprocess / örnekte olduğu gibi @ example.org

Ardından, dosya adı ftok diyoruz. ftok benzersiz bir tamsayı kimliği dönecektir.

Bu olsa benzersiz olmasını garanti olmayacak, ama muhtemelen sizin API için yeterli olacaktır.