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.
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.
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