Van jobb megoldás erre a Firebase unique kód generálásra?
Gyorsan a projektről amin dolgozom:
iOS app, Firebase
Egy játékot csinálok, amiben úgy lehet csatlakozni más létrehozott játékához, hogy megosztanak veled 1 kódot, ha jó kódot irsz be akkor csatlakozni tudsz a játékhoz, ha nem jó a kód akkor nyilván hibaüzenetet kapsz.
Amikor valaki létre szeretne hozni egy új játékot, akkor neki generálni kéne 1 kódot a játékhoz, de hogyan tudnám leghatékonyabban megnézni, hogy ez a kód létezik-e már az adatbázisban?
Mert használhatnám a uid-t amit létrehoz a collectionbe a firebase, de az túl hosszú, nekem elég lenne mondjuk egy 6 hosszú string.
Most generálni egy ilyen stringet nem nehéz, de ha lenne 1 millió játék az adatbázisban (nyilván nem lesz, ez csak egy hobbi projekt), akkor lehet hogy 5x olyan stringet generálnék ami már létezik és akkor az 5 fölösleges firebase olvasás, de nem látok erre jobb megoldást.
Mire beküldtem a kérdést rájöttem, hogy nem lenne 5 fölösleges olvasás, mert elég egyszer olvasni az egész adatbázist és azt egy tömbben tárolni, majd utána generálni és figyelni arra hogy abban ne létezzen.
Csak attól még mindig 1 millió játéknyi adatot kéne olvasni minden új játék létrehozásánál ami gondolom szintén nem túl jó.
Erre nézve nincs jobb, mint amit leírtál.
A kód generálása és a már létező kódok listájával való összevetése. Ha talál egyezést, akkor újra generál. Ennyi.
Hat karakter hosszra nem is egy proci izzasztó feladat ez.
Azt is csinálhatod, hogyha string-et akarsz akkor csinálsz egy bijektív szám -> string függvényt. Például 26-os számrendszerbe átváltod (a->0,b->1,c->2 ... z->25) ha az angol abc kisbetűit tartalmazhatja a string.
Az elv a következő : generálsz egy random egész számot 0-tartományméret között. Ennyiedik elemét kiolvasod az asszociatív tömbödnek ha létezik, ha nem akkor létrehozod benne.
Azaz Ha k a generált szám arr a tömb akkor
Ha nem létezik k-adik eleme akkor arr[k] = k
Ha létezett ha nem akkor is arr[k] értéket adod vissza.
Ez után az alábbi értékadást csinálod : arr[k] = arr[tartományméret - elemszám(arr) - 1] .
Garantáltan nem lesz ütközés. A teljes tartományméretig ez a módszer működik. A teljes tartományméretig végigfuttatva ez megfeleltethető a random keverő algortimusnak.
Az asszociatív tömböt tárolhatod nosql adatbázisban. Ha jól emlékszem key - value párokat tároló nosql adatbázis a ndbm. Nincs típus csak nyers blob-okat tárol (python-ban erre van szerializáció emlékeim szerint). Akármilyen erre alkalmas adatbázis lehet, ez csak egy tipp volt.
@18:08:
Kifejletettem, hogy a generátornak a generálási tartományt mindig egyesével csökkenteni kell :
így kell tömbindexet kisorsolni : randrange(tartományméret - elemszám(arr)) kell generálni.
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!