URL kısaltma siteleri gibi PHP kısa hash

4 Cevap php

Ben gibi bu URL kısaltma web sitelerine benzer bir dize veya bir dosya, dışarı kısa bir karma yaratan bir PHP fonksiyonu arıyorum tinyurl.com

Karma 8 karakterden daha uzun olmamalıdır.

4 Cevap

URL kısaltma servisleri yerine (bir ek veritabanı kimliği gibi) bir otomobil artan tamsayı değeri kullanmak ve (yerine sadece 10 basamak gibi 64) karakterinin başına daha fazla bilgi için Base64 veya diğer kodlamaları ile bu kodlar.

TinyURL şey karma değil, onu ziyaret için hangi kayıt belirtmek için (alt ve büyük harfleri kullanarak, hatta tabanı 62) Base 36 tamsayıları kullanır.

Tamsayı'ya Base 36:

intval($str,36)

Base 36 tamsayı:

base_convert($val, 10, 36)

Öyleyse, yerine /url/1234 yerine /url/ax olur gibi bir rotaya yönlendirme. Hiçbir çarpışmalar olacak gibi, bu, size bir karma irade daha bir sürü daha kullanım sağlar. Bir url varsa bu ile kolayca kontrol edebilir ve bu veritabanında zaten bilerek kullanıcı olmadan tabanının 36 doğru, mevcut, kimliği döndürür.

Bu tür bir şey için diğer üsleri kullanmak, karma etmeyin. (Daha hızlı ve çarpışma geçirmez yapılabilir.)

Ben tamsayılar itibaren karartılmış sağlamalarının üretmek için küçük bir lib yazdı.

http://blog.kevburnsjr.com/php-unique-hash

$ids = range(1,10);
foreach($ids as $id) {
  echo PseudoCrypt::uhash($id) . "\n";
}
m8z2p
8hy5e
uqx83
gzwas
38vdh
phug6
bqtiv
xzslk
k8ro9
6hqqy

Kısa karma Eğer md5 hash ilk 8 karakteri nasıl kullanabileceğinizi hiç, 32 karakter uzunluğu

echo substr(md5('http://www.google.com'), 0, 8);

Update: Buraya here Travell Perkins hangi kayıt numarasını alır ve bunun için kısa karmasını oluşturmak tarafından yazılmış bulunan başka bir sınıftır. 14 basamaklı sayı 8 haneli dize üretir. Tarihe göre size tinyurl daha popüler hale bu sayı ulaşmak ;)

class BaseIntEncoder {

    //const $codeset = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    //readable character set excluded (0,O,1,l)
    const codeset = "23456789abcdefghijkmnopqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ";

    static function encode($n){
        $base = strlen(self::codeset);
        $converted = '';

        while ($n > 0) {
            $converted = substr(self::codeset, bcmod($n,$base), 1) . $converted;
            $n = self::bcFloor(bcdiv($n, $base));
        }

        return $converted ;
    }

    static function decode($code){
        $base = strlen(self::codeset);
        $c = '0';
        for ($i = strlen($code); $i; $i--) {
            $c = bcadd($c,bcmul(strpos(self::codeset, substr($code, (-1 * ( $i - strlen($code) )),1))
                    ,bcpow($base,$i-1)));
        }

        return bcmul($c, 1, 0);
    }

    static private function bcFloor($x)
    {
        return bcmul($x, '1', 0);
    }

    static private function bcCeil($x)
    {
        $floor = bcFloor($x);
        return bcadd($floor, ceil(bcsub($x, $floor)));
    }

    static private function bcRound($x)
    {
        $floor = bcFloor($x);
        return bcadd($floor, round(bcsub($x, $floor)));
    }
}

Burada örnek kullanmak için nasıl:

BaseIntEncoder::encode('1122344523');//result:3IcjVE
BaseIntEncoder::decode('3IcjVE');//result:1122344523