en verimli şekilde - benzersiz bir anahtar yaratıyor

9 Cevap php

Ben iki işlev, makeKey () ve keyExists var ().

makeKey () sadece bir 5 haneli rasgele alfanümerik tuşu, keyExists () onun tek argüman olarak bu anahtarı kabul üretir, ve var olmasına bağlı olarak doğru / yanlış dönen, bir tabloda arar.

Ben çok basit bir şey yapmak gerekiyor ama bunu yapmanın en hızlı yolu anlamaya olamaz.

Ben sadece bir anahtar yapmak gerekir, ve bu tabloda varsa benzersiz bir tek geri dönene kadar, yani yine bir anahtar yapmak, ve. Ben bir süre döngü yeterli olacağını düşünüyorum?

Teşekkür ve oldukça temel bir soru lütfen affet, ben dün güneşte beynimi pişmiş düşünüyorum.

9 Cevap

: while döngü - Ben bir do kullanmak istiyorum

do {
    $newKey = makeKey();
} while (keyExists($newKey));

Anahtar henüz yoksa kadar bu her tekrarında yeni bir anahtar oluşturmak olacaktır.

Kontrol, sonra oluşturmaya dayanan herhangi bir çözüm anahtar alanı doldurur gibi korkunç bir performansa sahip oluyor. Bir autogenerated sütunu (kimlik veya guid) kullanarak benzersiz bir anahtar üreten daha iyi olurdu. Alfanümerik olması gerekiyorsa, bit gruplarını seçerek ve alfabenin içine bir göstergesi olarak bunları kullanarak seçtiğiniz alfabesine dönüştürmek için bir eşleme işlevini kullanın.

Pseudo-kod

alphabet = "ABCDE...789";
key = insert new row, get autogenerated key
alphaKey = "";
while (get n bits from key)
   alphaKey += alphabet[bits]
done
echo alphaKey

Benim php biraz paslı, yani bu sözde-kodu göz önünde bulundurun:

$key_exists = true;
while($key_exists) {
       $key = generateKey();
       $key_exists = checkKey($myKeysHash, $key);
}
// $key is now unique and ready to use

Neden kullanmak değil gibi php işlevi yerleşik uniqid()?

Sen bir tablo söz, böylece bir veritabanında bu anahtarlarını saklamak eğer ben merak ediyorum? Böylece, sizin yaklaşım bir yarış durumu sahip oluyor - Eğer başka bir işlem bu anahtarı kullanır önce bir anahtar kullanma hakkı Tamam kontrol edebilirsiniz.

Belki de başarılı olana kadar farklı anahtarlar ile tuşları ve yeniden deneniyor bir masanın üzerine bir INSERT gerçekleştirerek - Daha iyi bir yaklaşım, olası bir anahtar oluşturmak ve sonra devam etmek girişimi olduğunu.

Ben de size veritabanı çeşit kullanarak kabul edeceğiz.

Eğer veritabanında eşsiz bir otomatik artış kimlik sütunu kullanmak değil misiniz? Bu veritabanı motoru iki kez aynı kimliği atamak asla beri anahtar varsa kontrol etmek için gereksinimini ortadan kaldıracaktır.

Ancak, yerine sadece yeni işlevler kadar kodlama daha da uygulama mantığı değiştirmek olurdu.

Rasgele olması gerekiyor mu? Sadece bir değişkeni artırmak ve başka bir alanda kullanılmak üzere bir sonraki saklayın.

while (keyExists($newKey = makeKey()));

Muhtemelen onay yapmanın en hızlı yolu, bir anahtar varsa, yeni bir tane oluşturur. Eğer yeni bir benzersiz anahtarı almadan önce veritabanı birçok kez kontrol etmek gerek / çarpışmalar çok sahip başlatırsanız, muhtemelen makeKey () algoritması yeniden düşünmek isteyeceksiniz. DB Aramalar, size daha hızlı ve daha verimli komut olacaktır yapabilirsiniz az aramaları pahalıdır.

Eğer 5 haneli sayı sabit değil iseniz, size id bir karma + bir isim sütunu kullanarak düşünebiliriz.