63 milyon ödül kodları oluşturmak için nasıl

9 Cevap

Ben bir yarışmada kullanılmak üzere yaklaşık 63million benzersiz kodlar üreten bir "akıllı" ve "güvenli" bir yol ile gelip çalışıyorum. Kodlar yaklaşık 10 karakter uzunluğunda olacak.

Herkes bu konulardan doğabilecek herhangi bir "engel" benzer veya farkında şey yaptı mı? Nasıl biz birisi kodları tahmin edememek olasılığını en aza indirmek mi?

Bu proje PHP yapılacaktır, ama bu gerçekten önemli değil, burada bir sorun var mantık daha fazla bulunuyor.

Herhangi bir görüş gerçekten takdir.

UPDATE Just to clarify it will be 10 characters of case insensitive Alpha Numeric Values. A-Z0-9

9 Cevap

Syntax:

Muhtemelen bu kodları kopyalayarak insanlar olacaktır, böylece bu kodlar kopyalamak için kolay olmalıdır anlamına gelir. Gamecat işaret ettiği gibi 10 ^ 10, çok küçük. kgiannakakis daha iyi bir fikri vardır, ama bu başka bir soruna neden olur: "1", "I" gibi bir çok görünüyor. "0", "C", "O" ve "Q" da oldukça benzer. Bu büyük bir sorun değildir. Güvenli alfabet tanımlayın: "0123456789ABDEFGHJKLMNPRSTUVXYZ" (COIQ bırakır) From the comments: depending on the fonts you pick, 5/S and U/V may also be visually ambiguous; replace as required. Bu 32 simge (5 bit) kodudur. A 10 karakter kodu 50 bit sayıdır. Bu tahmin olma şansı vb karşılaştırma, sıralama, kopya oluşturmak için oldukça Önemsiz olmalıdır yaklaşık 0.63E-7

Kodlar hatırlamak çok uzun olduğundan bunları kopyalarken, kullanıcılar bir dinlenme noktası gerekir. Yani iki veya üç parça dize bölmek ve giriş alan bu arıza uyduğundan emin olun.

Örneğin AKG3L-45TEE => iki grup 5 ve 5 karakter hatırlamıyorum bile o okuma durduğu noktayı geri bulmak çok daha kolay.


How to generate them:

Bu oldukça basit. Sen adayları oluşturmak için özellikle sophistciated algoritma gerekmez. Sen, ihtiyaç duyulan kod başına 10 rasgele sayılar üretmek her sayıdan 5 biti alabilir (typically the middle bits are best, e.g. (rand()/64) modulo 32). Lütfen alfabesine içine dizin olarak bu değeri [0-31] kullanın. Birincil anahtar olarak bu dize ile bir veritabanı tablo oluşturun ve tablo 63 milyon girdileri vardır kadar yerleştirin. Muhtemelen "üzerinde oluşturulan" ve bu tabloya tarihlerde "itfa" eklemek istiyorum.

Ben doğru anlamak, düşük bir "tahmin faktörü" var 10 haneli 63 milion kodları oluşturmak istiyorum.

10000000000 geçerli kombinasyonlar vardır. Bunların 63.000.000 fiyat sayılardır. = 0,0063 63/10000. Yani her tahmin bir başarı 0,63% şansı var. Yüksek ses, ancak kaba kuvvet ile, sayılar elde etmek oldukça kolay değil.

Eğer 63 10.000 üzerinde oranı yeterince iyi olduğuna emin misin?

{2 [(0)]} -1 - 0 ila üzerinde gerçekten rasgele, tek 64-bit numaraları kümesi oluşturmak. Eğer görülen ve çiftleri reddetmek var olanları takip etmek gerekir. İngiliz alfabesi (büyük veya küçük harf) eksi L ve O artı rakam 2-9 temelde tüm harfler (Bu l arasındaki karışıklığı azaltır - 32 karakter alfabesinden bu sayı çekme alt 50 bit her 5 bit kullanın / 1 ve 0 / O). 63 milyon kodlar için, bu size bir 0.000006 olasılığının% (63.000.000 / 2 50) rastgele geçerli bir kod dizisi seçerek verecekti.

Ben de bir autogenerated, birincil anahtar (int) kullanarak bu yapılır ve bir 32-bit rasgele değer ile bit-harmanlayabilmekle ettik. Bu durumda ben alfabesinden 13 karakter oluşturmak için tam 64-bit kullandık ve 15-karakter kodu için sabit pozisyonlarda iki rasgele karakter eklendi. Eğer iki ekstra rasgele karakterler atmadan, anahtar ve Rasgeleliği ayıklamak için algoritma ters kodunu kurtarıcı, o zaman kodu doğrulamak için anahtar ile depolanan bulduğu rasgelelik karşılaştırın.

Kodlar için alphanumerics kullanırken yanlışlıkla kafa karıştırıcı ya da utanç verici bir şey oluşturmak istemiyorum gibi, dikkatli olun. Karışıklığı önlemek için ben yanlışlıkla bir şey büyü değil böylece utanç (burada hayal gücünüzü kullanın) tüm sesli harfleri kaldırarak dikkate önlemek için 1 ve L, 0 ve O, ve belki 8 ve B kaldırarak öneririz.

PHP alfa-sayısal dizeleri üretmek için bu link bakın. Bu yeteri kadar güvenli olmalıdır ki, 36 karakterden oluşan bir alfabe kullanır. Ancak teklik garanti edilmez. Bunu uygulamak için bir Set kullanabilirsiniz sanırım. Bu sadece bir kerelik bir işlem olduğu için, çiftleri için test için zaman gecikmesi büyük bir anlaşma olmamalıdır.

Güvenli bir rasgele sayı üreteci kullanmak.

Onlar benzersiz katılımcılar için ise, her katılımcı adını (ve / veya) ayrıntılarını karma ve sonra ilk 10 karakter kadar kesebilirsiniz.

Belki bu size biraz yardımcı olacaktır: Universal Unique Identifier

The intent of UUIDs is to enable distributed systems to uniquely identify information without significant central coordination. Thus, anyone can create a UUID and use it to identify something with reasonable confidence that the identifier will never be unintentionally used by anyone for anything else.

Sen kodlar 10 'karakter' uzunluğunda söylüyorlar, ama karakterin ne ayarlanır?

Sadece rakam ise, o zaman (@ Gamecat) muhtemelen rastgele bir kod sanırım biraz çok kolay olacak.

Karakter seti harf + rakam ise diğer yandan, o zaman güvenlik bol var.

Her durumda güvenli rasgele sayı üreteci kullanarak oluşturmak ve bir veritabanında koymadan önce çiftleri kontrol.