PHP / MySQL benzersiz kodlar oluşturuluyor?

6 Cevap php

Ben böylece dergi kazı-kazan kartları, bottlecap ödüller ve kullanılan alfanümerik kodların milyonlarca üretmek için gereken bir istemci ile çalışıyorum. Onlar 1 ve I, 0 ve O, vb gibi belirsiz karakterler dahil olmadığından emin olmak istiyorum, bir kap yazdırmak için yeterli kısa olması, ve onlar açıkça ileride kullanılmak üzere saklanabilir var - biz ' t sadece birisi bir kurtarmak için çalıştığında 'geçerliliğini' belirleyen bir algoritma var. Son olarak, insanların sadece alfabede yürürken ek kodları tahmin edemez böylece kodları rastgele bir büyük "kod alanı" içinde dağıtılan emin olmak istiyorum.

Kod setleri bu tür üretmek için oldukça verimli algoritmalar yönelik herhangi bir işaretçiler var mı? Ben bir zarfın arkasında birkaç dışarı çizik var, ama bu sorun gafil bir tuzak gibi kokuyor.

6 Cevap

(Örneğin) yaklaşık 10 milyon benzersiz anahtarlar gerekiyorsa, en iyi yaklaşım katlanarak daha büyük olan bir anahtar alan seçin ve üreten rastgele başlamaktır. Birthday Paradox hakkında okuyun - bu endişe edilmesi gereken ana şey. Eğer 2 ^ n eşsiz ve güvenli tuşları istiyorsanız, emin, en az 2 ^ (2 * n) olası değerler vardır olun. : Burada kaba O (n log n) algoritma

  • (Yani, başka bir deyişle, 2 ^ 50 olası benzersiz değerlere izin), ve sizin tüm kümesi ancak herhangi çarpışmalar olacak ^ 50 en az 2 önemli bir boşluk kullanın - ve herkes anahtarlarını zorlayarak kaba bile hakkında sahip olacaktır onlar 2 ^ 25 denerseniz anahtarı alma oran.
  • İhtiyacınız kadar rasgele sayı üretmek
  • anahtara dizin veritabanı (bu O (n lg n) adım: sort)
  • sayfa DB üzerinden ve (yalancı aşağıda) çiftleri trim, tüm veri seti üzerinde yineleme
  • Yinelenen satırları silmek, ve bitirdiniz.

Pseudocode:

$last = null;
while ($current = getnext()) {
    if ($last == $current) {
        push($toDelete, $current);
    }
    $last = $current;
}

Diyelim ki kesin, üst alt ve sayısal karakterler 40 semboller, diyelim ki, bir karakter kümesi kullanabilirsiniz varsayalım.

N karakter dizisi için, 40 n kombinasyonları var

  • 40 4 = 2.560.000
  • 40 5 102.400.000 =
  • 40 6 = 4096000000
  • 40 7 = 163840000000
  • 40 8 = 6.553.600.000.000

Böylece 8 karakter çalışmak için oldukça iyi bir yer verir - Eğer 10 milyon kodları oluşturulur ise, bir kod kaba kuvvet yüzlerce kombinasyonları binlerce denemek olurdu.

Ya da diğer yönden geliyor - possible kodları, kaç kodları should Eğer dedikleri tuzak önlemek için üretmek sayısını vermek Birthday Paradox?

8 karakter kodu alarak, 6.553.600.000.000 42, böylece makul ondan 2 21 kodlarını oluşturabilir yaklaşık 2, ya da 2097152

Bu soruyu çıkış, hemen hemen aynı: http://stackoverflow.com/questions/55218/unique-key-generation

Bir kerelik parola algoritmasını kullan?

HMAC algoritmasına dayalı RFC4225 ayrıntılar biri.

http://www.ietf.org/rfc/rfc4226.txt

ancak bunun yerine 0-9 basamak Base10 kodlamayı kullanarak, base32 kullanın.

Kullandığınız whatver yöntem, ben insanların yanlış girmesi ya da bir numara icat çalışırken karşı bir "first-line" savunma olarak bir çek rakam veya iki eklemek öneririm.

Işin garibi, şu tohum ile sadece 32 eşsiz dizeleri oluşturmak başardı.

ABCDEFGHJKLMNPQRSTUVWXYZ23456789

Başarıyla oluşturulan 40.000 eşsiz dizeleri - uzun bir tohum ile ben daha çok üretmek mümkün oldu.

ABCDEFGHJKLMNPQRSTUVWXYZ234567892345678923456789ABCDEFGHJKLMNPQRSTUVWXYZ234567892345678923456789ABCDEFGHJKLMNPQRSTUVWXYZ234567892345678923456789