2011-03-24 19 views
9

जेएसएफडल जैसी साइटों का उपयोग करने के बाद मैंने देखा कि वे ऑटो ऊपरी और निचले केस वर्णों से बना एक यादृच्छिक और अद्वितीय यूआरएल उत्पन्न करते हैं।PHP यादृच्छिक यूआरएल नाम (लघु यूआरएल)

हम अपने बुकिंग पृष्ठों के लिए इससे लाभ उठा सकते हैं। यह कैसे किया जाता है?

उत्तर

20

यह आपके डेटाबेस रिकॉर्ड की आईडी के आधार पर यादृच्छिक नहीं है।

यह कैसे काम करता:

मूल रूप से आप एक स्ट्रिंग है अद्वितीय है है, लेकिन यह एक संख्या का प्रतिनिधित्व करने के decrypted किया जा सकता है, तो आप एक छोटी एन्क्रिप्शन/डिक्रिप्शन के रूप में यह पर गौर करना चाहिए।

आपके पास एक ऐसा फ़ंक्शन है जो एक अद्वितीय आईडी लेगा और फिर यह उस आईडी से एक अद्वितीय 'शॉर्ट स्ट्रिंग' बनाता है, और फिर आप छोटी स्ट्रिंग से अद्वितीय आईडी प्राप्त करने के लिए प्रक्रिया को उलट सकते हैं।

alphaID(9007199254740989); //-> PpQXn7COf 
alphaID('PpQXn7COf', true); //-> 9007199254740989 

वहाँ स्क्रिप्ट के लिए एक लिंक है

function alphaID($in, $to_num = false, $pad_up = false, $passKey = null) 
{ 
    $index = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    if ($passKey !== null) 
    { 
     /* Although this function's purpose is to just make the 
     * ID short - and not so much secure, 
     * with this patch by Simon Franz (http://blog.snaky.org/) 
     * you can optionally supply a password to make it harder 
     * to calculate the corresponding numeric ID */ 

     for ($n = 0; $n<strlen($index); $n++) 
     { 
      $i[] = substr($index,$n ,1); 
     } 

     $passhash = hash('sha256',$passKey); 

     $passhash = (strlen($passhash) < strlen($index)) ? hash('sha512',$passKey) : $passhash; 

     for ($n=0; $n < strlen($index); $n++) 
     { 
      $p[] = substr($passhash, $n ,1); 
     } 

     array_multisort($p, SORT_DESC, $i); 
     $index = implode($i); 
    } 

    $base = strlen($index); 

    if ($to_num) 
    { 
     // Digital number <<-- alphabet letter code 
     $in = strrev($in); 
     $out = 0; 
     $len = strlen($in) - 1; 

     for ($t = 0; $t <= $len; $t++) 
     { 
      $bcpow = bcpow($base, $len - $t); 
      $out = $out + strpos($index, substr($in, $t, 1)) * $bcpow; 
     } 

     if (is_numeric($pad_up)) 
     { 
      $pad_up--; 
      if ($pad_up > 0) 
      { 
       $out -= pow($base, $pad_up); 
      } 
     } 
     $out = sprintf('%F', $out); 
     $out = substr($out, 0, strpos($out, '.')); 
    } 
    else 
    { 
     // Digital number -->> alphabet letter code 
     if (is_numeric($pad_up)) 
     { 
      $pad_up--; 
      if ($pad_up > 0) 
      { 
       $in += pow($base, $pad_up); 
      } 
     } 

     $out = ""; 
     for ($t = floor(log($in, $base)); $t >= 0; $t--) 
     { 
      $bcp = bcpow($base, $t); 
      $a = floor($in/$bcp) % $base; 
      $out = $out . substr($index, $a, 1); 
      $in = $in - ($a * $bcp); 
     } 
     $out = strrev($out); // reverse 
    } 
    return $out; 
} 

उदाहरण:: https://github.com/kvz/deprecated/blob/kvzlib/php/functions/alphaID.inc.php

0

आप बस सभी संभावित पात्रों की एक सरणी बना सकते हैं, फिर यादृच्छिक रूप से उन लोगों को चुन सकते हैं जिन्हें आप चाहते हैं और उन्हें "कोड" के रूप में वापस कर सकते हैं?

 
$arr = array('a','b','c','d'); 
$count = count($arr) - 1; 
$str = $arr[rand(0, $coun)].$arr[rand(0, $coun)]; 
+0

लेकिन इस तार नकल करने ले जा सकता है (हालांकि

यहाँ एक Snipped मैं एक वेबसाइट के पाया है है बहुत संभावना नहीं है)। – acme

+0

क्या इससे कोई फर्क पड़ता है? केवल एक चीज जो आपको करने की ज़रूरत है, यह सुनिश्चित करने के लिए जांचें कि यह कुछ विधि (जैसे कि डीबी लुकअप, अगर उस तरह से संग्रहीत है) द्वारा अद्वितीय है। – Alex

2

uniqid() फ़ंक्शन का उपयोग करता है, तो आप सिर्फ एक निर्दिष्ट लंबाई के एक यादृच्छिक आईडी चाहते हैं या अपने लंबे यूआरएल की md5() हैश का उपयोग करता है, तो आप कुछ दोहराने योग्य की जरूरत है। (किसी दिए गए इनपुट के लिए आउटपुट हमेशा एक ही होता है)। Creating a short URL service using PHP and MySQL यह सब एक साथ रखने के लिए एक अच्छा रंडाउन देता है।

1

यह बहुत आसान है।

आपके url www.domain.com/in/here/RANDOMPART

की तरह कुछ आप अपनी पसंद का एक स्क्रिप्ट के www.domain.com/in/here/* पुनर्लेखन है। इस स्क्रिप्ट में आप अनुरोधित यूरी को ग्लोबल्स के साथ प्राप्त कर सकते हैं और आप इसे विभाजित कर सकते हैं और अंतिम '/' के बाद भाग का उपयोग कर सकते हैं। यह आपका रैंडमपार्ट है। बस इसे अपने डीबी या जो कुछ भी के खिलाफ जांचें।

ऐसे यूआरएल बनाने के लिए आपको बस "www.domain.com/in/here/" के पीछे कुछ जोड़ना होगा। आप md5(uniqid(rand(), true)) के साथ एक अच्छी आशावादी अद्वितीय स्ट्रिंग को जोड़ सकते हैं।

इस स्ट्रिंग को डीबी या जो कुछ भी में सहेजना न भूलें।

आशा है, जो मदद करता है।

इन पंक्तियों के साथ
1

कुछ:

<?php 
    $url_length = rand(10,20); //generate a random number between 10 and 20 for the length of the URL 
    $url = array($url_length); 
    for($i=0; $i < $url_length; $i++) 
    { 
    $char = 0; 
    while($char < 65 OR $char > 122 OR ($char > 91 AND $char < 97)) 
    { 
     $char = rand(65,122); 
    } 
    $url[] = chr($char); 
    } 
    print_r($url); 
?> 

नोट इस आंशिक रूप से छद्म कोड है। यह एक यादृच्छिक लंबाई (कहीं 10 और 20 के बीच) के साथ एक यूआरएल बनाता है, और प्रत्येक वर्ण को यादृच्छिक ASCII कोड के साथ पॉप्युलेट करता है जो वर्णमाला में एक अक्षर को कोरसपॉन्ड करता है। ASCII तालिका में ऊपरी और निचले केस अक्षरों के बीच कुछ "जंक" वर्ण हैं, इसलिए यह एक वैध ASCII संख्या उत्पन्न होने तक यादृच्छिक संख्या को फिर से चलाएगा।

यह मानता है कि आप इस यूआरएल को डेटाबेस में संग्रहीत कर रहे हैं। यह सुनिश्चित करने के लिए कि यह स्ट्रिंग अद्वितीय है, आपको यह देखने की आवश्यकता है कि यह अभी तक डेटाबेस में मौजूद है या नहीं। यदि नहीं, तो इसे जोड़ें और आप ठीक हैं। यदि यह अस्तित्व में है, तब तक प्रक्रिया को दोबारा दोबारा करें जब तक आपको एक अद्वितीय स्ट्रिंग न मिल जाए।

संबंधित मुद्दे