» »

Generiranje kombinacij znakov

Generiranje kombinacij znakov

c0dehunter ::

Zdravo, rabim funkcijo, ki bi mi generirala takele kombinacije:

a
b
...
aa
ab
...
aaa
aab
...

... do poljubne dolžine n. Poskušal sem z for zankami in z rekurzijo, vendar se zaplete pri pogojih (npr. hočemo samo male črke in številke, oz. hočemo velike črke in posebne znake).
Obstaja že kakšna uveljavljena praksa kak to dosežit? Če je kaj važno, delam v C#.
I do not agree with what you have to say,
but I'll defend to the death your right to say it.

WarpedGone ::

1. sestavi niz možnih znakov
2. naredi funkcijo ki iz nekega niza generira nove nize tako da k podanemu nizu dodaja po en znak iz niza možnih znakov
3. zgornjo funkcijo vpni v začetne in končne pogoje tako, da štartaš s praznim nizom, nato pa rezultat pofutraš za generiranje novih nizov
Zbogom in hvala za vse ribe

c0dehunter ::

Aha, na tak način lahk pol naredim eno generično funkcijo, ki doda znak glede na vhodni niz. Hvala, bom poskusil!
I do not agree with what you have to say,
but I'll defend to the death your right to say it.

Mitja Bonča ::

kako se nadaljuje?
1. a,b,c,d,e,....
2. aa, ab, ac, ad, ae,...
3. aaa, aab, aac, aad, aae...

je to pravilno?

c0dehunter ::

Recimo samo za male črke:
a,b,c,...
aa,ab,ac,...
ba,bb,bc,...
ca,cb,cc,...
.
.
.
aaa,aab,aac...
baa,bab,bac...


Vendar imam še možnosti za nabor znakov (samo male, posebni znaki, mešano,...)
I do not agree with what you have to say,
but I'll defend to the death your right to say it.

Mitja Bonča ::

A pokažeš kakšno rekurzijo si naredil?

Spura ::

Simpl. Uporabis Stack + yield.

Spura ::

        static void Main(string[] args)
        {
            List<char> ll = new List<char>();
            ll.Add('a');
            char[] allowedCharacters = new char[] { 'a', 'b', 'c' };
            IEnumerable<string> gg = GetStringPermutations(allowedCharacters);
            Console.Out.WriteLine(gg.Skip(6).First());
            Console.In.ReadLine();
        }

        static IEnumerable<string> GetStringPermutations(char[] allowedCharacters)
        {
            List<char> currentString = new List<char>();
            currentString.Add(allowedCharacters[0]);
            yield return new string(currentString.ToArray());
            while (true)
            {
                if (allowedCharacters.Length == 1)
                {
                    currentString.Add(allowedCharacters[0]);
                }
                else
                {
                    currentString = FlipCharacters(currentString, allowedCharacters);
                }
                yield return new string(currentString.ToArray());
            }
        }


        static List<char> FlipCharacters(List<char> currentString, char[] allowedCharacters)
        {
            // nekaj pomoznih spremenljivk
            char lastAllowed = allowedCharacters[allowedCharacters.Length - 1];
            char firstAllowed = allowedCharacters[0];
            // zacnemo s prvim znakom od zadaj
            char firstCharacter = currentString[currentString.Count - 1];
            // ga spremenimo v naslednji znak
            firstCharacter = FindNextCharacter(firstCharacter, allowedCharacters);
            currentString[currentString.Count - 1] = firstCharacter;
            // ce imamo vec znakov in ce je prvi znak od zadaj prisel okoli
            if (currentString.Count > 1 && firstCharacter == firstAllowed)
            {
                // obracamo znake, dokler ne obrnemo enega, ki ni sel okoli
                for (int i = currentString.Count - 2; i >= 0; i--)
                {                    
                    if (currentString[i] == lastAllowed)
                    {
                        currentString[i] = firstAllowed;
                        // ce so vsi sli okoli dodamo nov znak
                        if (i == 0)
                        {
                            currentString.Add(firstAllowed);
                        }
                    }
                    else
                    {
                        currentString[i] = FindNextCharacter(currentString[i], allowedCharacters);
                        break;
                    }
                }
            }
            else if (currentString.Count == 1 && firstCharacter == firstAllowed)
            {
                // samo en znak in ta se je obrnil
                currentString.Add(firstAllowed);
            }
            return currentString;
        }


        static char FindNextCharacter(char c, char[] allowedCharacters)
        {
            if (c == allowedCharacters[allowedCharacters.Length - 1])
            {
                return allowedCharacters[0];
            }
            for (int i = 0;i < allowedCharacters.Length;i++)
            {
                if (c == allowedCharacters[i])
                {
                    return allowedCharacters[i + 1];
                }
            }
            return allowedCharacters[0];
        }


GetStringPermutations vrne IEnumerable, ki vsebuje neskoncno zaporedje teh nizov. Sam tok, da ne bos da kakega foreach cez.

bigbada ::

Jaz imam tudi isto nalogo. @codehunter, asistent je rekel, da moraš regenerirati nekaj takega, ne pa kot si ti napisal. Recimo vneseš niz avto
potem pa ti regenerira tak dolgo, da pride do tega vnešenega niza

aaaa
aaab
aaac
aaad
..
aaao //tu se konca ker je tista črka enaka vnešeni torej avt[o]
//potem pa gre na predzadnjo
aabo
aaco
aado
...
aato
...
abto
acto
...
avto

Če se ne motim, bi moralo biti tako ? Samo še vedno ne razumem prvega dela glede MD5 šifriranja.. @codehunter mi lahko razlozis to malce bolj.. Torej ti vneseš not poljuben niz pa pač daš "MD5 Šifriranje" in potem ti te šifrirane nize shrani v XML datoteko?

WarpedGone ::

Kake klobase...
A vas po novem plačujejo po številu natipkanih znakov?
Zbogom in hvala za vse ribe

Spura ::

Sorci. Bom pocakal na tvojo kodo za generiranje neskocnega zaporedja takih nizov.

c0dehunter ::

bigbada, če bi bla naloga tak implementirana to ne bi bil "brute force" ampak "ugani besedo" oz. črko :)
Jaz delam tako, da najprej uporabnik vnese besedo, iz katere dobim MD5. Potem pa genreiram zaporedja znakov, dobivam njihov MD5 in primerjam z MD5 prvotne besede.
Drugi del naloge je "dictionary attack", pri katerem maš v XML datoteki shranjene možna gesla in potem njihove MD5 primerjaš z MD5 prvotne besede.

Bončina, rekurzija je tipa //če še nisi prišel do max, kliči rekurz(trenutna_beseda) - le ta pa dodaja nov znak iz polja možnih znakov//.

Spura, hvala bom pogledal.
I do not agree with what you have to say,
but I'll defend to the death your right to say it.

bigbada ::

Hmm, samo a ne bi pol predolgo trajalo, da ti zgenerira tako zaporedje, če imaš recimo dolgo MD5...

Torej, če prav razumem ti vneses recimo not random niz, in potem ti ta niz pretvori v MD5.. Potem pa moraš generirati zaporedje znakov, tako dolgo da bo to zaporedje enako tistemu nizu, ki je bil pretvorjen v MD5 ali tistemu nizu nasploh?

vneses not nevem blablablabla
pa ti zasifrira v j32njn3ide0w923nijfskmfemn

potem pa moraš generirat zaporedje znakov, da dobis ven blablablabla ali j32njn3ide0w923nijfskmfemn?
blablablabla pa se ti mora shraniti v XML? al se ti MD5 shrani v xml?
Pa a ne bi prišlo potem do problema časovne zahtevnost, ker če imaš dolgo MD5 kodo potem bi rabil algoritem dolgo časa da bi to zgeneriral?

Sory k sprašujem mogoče neumnosti, samo ni mi najbolj jasno kaj moramo narediti, ker je bolj bogo razložil.. V enem izdihljaju v 30 sekundah je povedal navodila..

genesiss ::

Seveda bi predolgo trajalo. Če bi papir prepognil 14krat bi bila zadeva debela 1,6m, če bi ga prepognil 30krat bi dosegel zunanje meje atmosfere.

http://raju.varghese.org/articles/power...

Zgodovina sprememb…

  • spremenil: genesiss ()

c0dehunter ::

Torej, če prav razumem ti vneses recimo not random niz, in potem ti ta niz pretvori v MD5.. Potem pa moraš generirati zaporedje znakov, tako dolgo da bo to zaporedje enako tistemu nizu, ki je bil pretvorjen v MD5 ali tistemu nizu nasploh?

Da bo md5 generiranega zaporedja enak md5 prvotnega niza. Ker v RL maš ti npr. nek DB enga foruma, in tam not so shranjena ne plain gesla ampak md5 gesel (ponekod je dodan še salt, ampak recimo da ga v našem primeru ni). No, in če hočeš ti dobit geslo, boš moral primerjat MD5 med seboj..

potem pa moraš generirat zaporedje znakov, da dobis ven blablablabla ali j32njn3ide0w923nijfskmfemn?

generiraš seveda stringe, iz katerih naknadno izvlečeš MD5.

blablablabla pa se ti mora shraniti v XML? al se ti MD5 shrani v xml?

Ne, brute force in dictionary attack sta dve različni stvari. Eno nima z drugim ničesar skupnega. Pri bruteforce sam generiraš možna gesla, pri dictionary attack pa imaš možna gesla že v datoteki.

Pa a ne bi prišlo potem do problema časovne zahtevnost, ker če imaš dolgo MD5 kodo potem bi rabil algoritem dolgo časa da bi to zgeneriral?

MD5 je vedno konstantne dolžine 32 znakov. Generiraš stringe možnih gesel, ne MD5 hashe.
I do not agree with what you have to say,
but I'll defend to the death your right to say it.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Web services - Neveljavni karakterji v XML

Oddelek: Programiranje
313581 (2693) boolsheat
»

delo z nizi

Oddelek: Programiranje
162865 (2409) tx-z
»

javascript nerazumljivo

Oddelek: Programiranje
61343 (1200) netanyahu
»

[C] Narascajoce sortiranje linearnega seznama

Oddelek: Programiranje
71757 (1646) Jebiveter
»

Pomoč pri MySQL in PHP...

Oddelek: Programiranje
161733 (1601) darh

Več podobnih tem