Bu kadar özgün olmak gibi bir MD5 hash bir altdizesine kullanarak mı?

4 Cevap php

Ne yapmaya çalışıyorum youtube, video id (http://www.youtube.com/watch?v=53iddd5IcSU) nasıl işleyeceğini benzer benim web sitesinde makaleler için 12 karakter kimliği oluşturmaktır. Şu anda ben bir MD5 hash üreten yaşıyorum ve daha sonra bunu böyle 12 karakter kapma:

$ArticleId = substr(MD5("Article".$currentID),10,12)

$ CurrentID'yi veritabanı (örneğin 144) gelen sayısal kimliği nerede

Ben bir yinelenen $ articleID içine çalışacağını biraz paranoyak değilim, ama bu olacağını şansı gerçekçi nelerdir? Ve aynı zamanda, benim veritabanında sütun benzersiz olduğunu varlık, nasıl çirkin bir hata atılır kalmadan bu nadir senaryo işleyebilir?

P.S. Ben ilk 5000 $ articleID yıllardan içindeki çiftleri kontrol etmek için küçük bir script yaptı ve yok edildi.

EDIT: Ben base64_encode karmaları bakmak beğenmiyorum ben yaptım:

function retryAID($currentID)
{
    $AID = substr(MD5("Article".$currentID*2),10,12);

    $setAID = "UPDATE `table` SET  `artID` =  '$AID' WHERE `id` = $currentID ";
    mysql_query($setLID) or retryAID($currentID);
}


$AID = substr(MD5("Article".$currentID),10,12);

$setAID = "UPDATE `table` SET  `artID` =  '$AID' WHERE `id` = $currentID ";
mysql_query($setAID) or retryAID($currentID);

AID sütun eşsiz olduğundan mysql_query bir hata atar ve retryAID fonksiyon benzersiz bir kimliği bulacaksınız ...

4 Cevap

<?php
  function get_id()
  {
    $max = 1679615; // pow(36, 4) - 1;
    $id = '';

    for ($i = 0; $i < 3; ++$i)
    {
      $r = mt_rand(0, $max);
      $id .= str_pad(base_convert($r, 10, 36), 4, "0", STR_PAD_LEFT);
    }
    return $id;
  }
?>

4.738.381.338.321.616.896 olanakları verir baz-36 bir 12 karakter sayısını döndürür. (Çarpışma olasılığı rasgele sayı üretecinin dağılımına bağlıdır.)

Hiçbir çarpışmaları sağlamak için, döngü gerekir:

<?php
do {
  $id = get_id();
} while ( !update_id($id) );
?>

Ne sıralı kimliği kullanarak nesi var? Veritabanı sizin için idare edecek.

Bu bir yana, 12 karakterler hala 96 bit. 2 96 79228162514264337593543950336 mümkün sağlamalarının =. MD5 çarpışma güvenlik açıkları olduğu bilinen olsa da, possibility aslında bir görme bir çarpışma ve probability in arasındaki fark bir dünya var.

Update:

Kullandığınız PHP md5 fonksiyonu dönüş değeri dayanarak, benim Yukarıdaki sayılar çok doğru değil.

32 karakter uzunluğunda onaltılık sayı olarak karma döndürür.

Eğer 32 karakter uzunluğunda onaltılık sayı (128-bit hash ve değil 12 bayt) 12 karakterleri alıyorsun beri, sizinle bitebileceğini olası sağlamalarının gerçek sayısı 16 12 = 281474976710656 olduğunu. hala epeyce.

Çok benzersiz değil hayır.

Eğer kısa ihtiyacınız varsa neden base64 kodlamak değil?