URL için base62 MD5 dönüştürmek

7 Cevap php

Ben tabanına dönüştürmek için bir komut dosyası var 62 (A-Za-z0-9) ama nasıl MD5 dışında bir dizi alabilirim?

Ben yine de kısa bir URL istediğim gibi ... Bir MD5 gelen sayı php bir tamsayı olarak işleyebilir daha büyük olduğu için yanlış olacağını birçok yerde okudum ve bütün karma, belki sadece 8 karakter kullanarak planlama değildi o ....

Yani benim soru MD5 hash numaranın bir kısmını almak için nasıl?

Ayrıca MD5 hash sadece bir bölümünü kullanmak için kötü bir fikirdir?

7 Cevap

Eğer CRC32 veya {[(1 gibi diğer kısa bir sayısal karma kullanmayın neden md5 karma bir ondalık kısmını kullanarak tek ilgilendi beri ben .. Burada farklı bir şey önermek için gidiyorum )]}? İşte bir örnek:

$hash = sprintf('%u', crc32('your string here'));

Bu dize 8 haneli bir karma üretecek.

EDIT: I think I misunderstood you, here are some functions that provide conversions to and from bases up to 62.

EDIT (Again): Eğer bc_math veya GMP uzantısı, here is a function that uses the bc_math extension and can also convert from base 2 up to base 62 kullanmak zorundadır keyfi uzunluğu numaraları ile çalışmak için. Bu gibi kullanmalısınız:

echo bc_base_convert(md5('your url here'), 16, 62); // public base 62 hash

ve ters:

echo bc_base_convert('base 62 encoded value here', 62, 16); // private md5 hash

Umarım yardımcı olur. =)

Mümkünse, ben senin URL'ler için bir hash kullanarak değil tavsiye ederim. Sonunda size karma kesiliyor konum, özellikle eğer ... çarpışmalar içine edeceğiz. Siz devam edin ve her öğe benzersiz bir kimliği olan bir id-tabanlı sistem uygularsanız, çok daha az baş ağrısı olacak. İlk öğe 1, second'll MySQL kullanıyorsanız eğer, sadece bir değiştirmemesi sütununda atmak --- 2, vb olacaktır olacaktır.

To make a short id:

//the basic example
$sid = base_convert($id, 10, 36);

//if you're going to be needing 64 bit numbers converted 
//on a 32 bit machine, use this instead
$sid = gmp_strval(gmp_init($id, 10), 36);

To make a short id back into the base-10 id:

//the basic example
$id = base_convert($id, 36, 10);

//if you're going to be needing 64 bit numbers
//on a 32 bit machine, use this instead
$id = gmp_strval(gmp_init($shortid, 36));

Bu yardımcı olur umarım!

If you're truly wanting base 62 (which can't be done with gmp or base_convert), check this out: http://snipplr.com/view/22246/base62-encode--decode/

Bunu da şöyle yapabilirsiniz: (Tüm adımlar php vardır, ben onu kullandım uzun bir zaman oldu.)

  • Bu gibi script bir md5 hash oluşturun:

    $ Hash = md5 (script, ham_çıktı = true);

  • Tabanı 62 için bu sayıyı dönüştürmek.

    base conversion of arbitrary sized numbers in PHP ile ilgili sorulara bakın

  • Sizin gibi bir uzunlukta dize kesecek.

Bir md5 bit sadece birkaç kullanarak hiçbir riski yok. Bütün bu değişiklikler çarpışma tehlikesi olduğunu.

Sen - ve _ yerine + ve ile biraz değiştirilmiş Base 64 kullanabilirsiniz / olabilir:

function base64_url_encode($str) {
    return strtr(base64_encode($str), array('+'=>'-', '/'=>'_'));
}
function base64_url_decode($str) {
    return base64_decode(strtr($str, array('-'=>'+', '_'=>'/')));
}

Ayrıca sen firar dolgu = karakter kaldırmak olabilir.

Ve ham MD5 değeri (ikili dize) almak için, için (kılavuzda $raw_output) adlı ikinci parametre kümesi true:

$raw_md5 = md5($str, true);

Böyle bir şey yapabilirsiniz,

$hash = md5("The data to be hashed", true);
$ints = unpack("L*num", $hash);

$hash_str = base62($ints['num1']) . base62($ints['num2']) . base62($ints['num3']) . base62($ints['num4'])

PHP 5.3.2 itibariyle GMP brianreavis önerisi çok yakın olduğunu, bu yüzden (sadece 36 önce olduğu) kadar 62'ye üsleri destekler. Ben sorunuzun basit cevap bu nedenle olduğunu düşünüyorum:

function base62hash($source, $chars = 22) {
  return substr(gmp_strval(gmp_init(md5($source), 16), 62), 0, $chars);
}

Base-16 dönüştürme temel-62 için tabii ki uzay faydaları vardır. Normal bir 128-bit MD5 hash onaltılık 32 karakteridir, ancak baz-62 sadece 22 yaşında. Bir veritabanında sağlamalarının depolamak ediyorsanız, ham ikili onları dönüştürmek ve için (16 bayt daha alanından tasarruf edebilirsiniz MD5).

Çıkan karma sadece bir dize temsilidir beri sadece (fonksiyonu olarak) bunun biraz istiyorsanız, sadece substr kullanabilirsiniz.

Aslında muhtemelen ayıklamak bir Java uygulaması var. Bu Pulse adlı bir açık kaynak CMS çözüm.

toBase62() ve fromBase62() kodunda için buraya bakınız.

http://pulse.torweg.org/javadoc/src-html/org/torweg/pulse/util/StringUtils.java.html

Sadece bağımlılık StringUtils hatta birlikte tüm ihmal veya sadece kopya {[(0)] için bir yöntem üzerinde kopya olabilir bir dize için bir tuzlu karma almak için bir yol sağlar LifeCycle-sınıf }. Voila.