Suche Funktion zum zählen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
xXRobo_CubeXx
Beiträge: 120
Registriert: 12.06.2015 16:08
Computerausstattung: Version 5.41 LTS
Wohnort: Wohnort
Kontaktdaten:

Suche Funktion zum zählen

Beitrag von xXRobo_CubeXx »

Tach, ich suche eine Funktion zum zählen von unterschiedlichen Zeichen in einen String.
Ich baue ein Password Manager und möchte rausfinden wie unterschiedlich oder komplex das PW is.

Ich will aber nich nur unterschieden ob Buchstaben Zahlen und Sonderzeichen sondern
wie viele unterschiedliche Buchstaben genutzt wurden.

Ich denk ma ich muss eine Schleife bauen und jeden Buchstabe mit dem anderen Buchstaben vergleichen
aber hab Probleme da mit. Kann mir jemand helfen? :)
Version 5.41 LTS :)
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Suche Funktion zum zählen

Beitrag von RSBasic »

Eine Variante:

Code: Alles auswählen

EnableExplicit

Procedure CountDifferentCharacters(String$)
  Protected NewMap Characters()
  Protected a
  
  For a=1 To Len(String$)
    Characters(Mid(String$, a, 1)) = 1
  Next
  
  ProcedureReturn MapSize(Characters())
EndProcedure

Debug CountDifferentCharacters("Hallo")
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
xXRobo_CubeXx
Beiträge: 120
Registriert: 12.06.2015 16:08
Computerausstattung: Version 5.41 LTS
Wohnort: Wohnort
Kontaktdaten:

Re: Suche Funktion zum zählen

Beitrag von xXRobo_CubeXx »

genau so wollt ich es haben danke :allright:
Version 5.41 LTS :)
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Re: Suche Funktion zum zählen

Beitrag von Kukulkan »

Ich hab mal sowas in JS geschrieben. Sollte nicht schwer sein das nach PB zu portieren:

Code: Alles auswählen

/**
 * Calculate a strength value from given password.
 * If Strength is > 30, the password is somehow safe!
 *
 * @param string Password
 * @returns int Strength
 */
function PassStrength(Password) {
    // length check
    var W = 0;
    var numCount = 0;
    W = (Password.length * Password.length) / 6;
    var numeric = !isNaN(parseFloat(Password[0])) && isFinite(Password[0]);
    if (numeric) { numCount = numCount + 1; }
    for (var i=1; i<Password.length; i++) {
        // if previous char was another one this is good, otherwise bad
        if (Password[i] != Password[i-1]) {
            W = W + 2;
        } else {
            W = W - 1;
        }
        // check, if previous char was other case the current (good)
        var upper =  (Password[i]   == Password[i].toUpperCase());
        var lower =  (Password[i]   == Password[i].toLowerCase());
        var pupper = (Password[i-1] == Password[i-1].toUpperCase());
        var plower = (Password[i-1] == Password[i-1].toLowerCase());

        // good if previous case is different than current
        if (upper != pupper || lower != plower) {
            W = W + 2;
        }

        // check if value is used multiple times
        var occurences = Password.split(Password[i]);
        if (occurences.length > 3) {
            W = W - 2;
        }

        // count number of numeric characters
        var numeric = !isNaN(parseFloat(Password[i])) && isFinite(Password[i]);
        if (numeric) { numCount = numCount + 1; }

    }
    // extra points if number of numeric characters is between 20 and 70 percent
    if (numCount > Password.length * 0.2 && numCount < Password.length * 0.7) {
        W = W + 5;
    }
    // not good if password is more than 70% numbers
    if (numCount > Password.length * 0.7) {
        W = W - 5;
    }

    // no negative results
    if (W < 0) { W = 0; }

    // return rounded result
    return Math.round(W);
}
Vorteil ist, dass die Qualität nicht nur nach der Länge, sondern auch nach der Variabilität richtet. Ob das passt ist natürlich auch Ansichtssache. Aber man kann das ganz einfach anpassen...
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Suche Funktion zum zählen

Beitrag von Kurzer »

Hier ein konventioneller Ansatz:

Code: Alles auswählen

EnableExplicit

Define.s sPasswort = "OttosDoppeldeckerstürztab1988)"
Define.s sStore, sChar
Define.i i

For i = 1 To Len(sPasswort)
	sChar = Mid(sPasswort, i, 1)
	If FindString(sStore, sChar) = 0
		sStore + sChar
	EndIf
Next i

Debug "Anzahl verschiedener Zeichen: " + Str(Len(sStore))
Debug "Die Zeichen selbst: " + sStore
Ergibt:

Code: Alles auswählen

[11:09:10] [Debug] Anzahl verschiedener Zeichen: 20
[11:09:10] [Debug] Die Zeichen selbst: OtosDpeldckrüzab198)
[11:09:10] Die Programmausführung ist abgeschlossen.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Suche Funktion zum zählen

Beitrag von ts-soft »

Ich würde ja noch mehr auswerten, um ein sicheres Passwort zu generieren.

1. Anzahl Zeichen (Allgemein alles)
2. Anzahl Buchstaben
3. Anzahl Zahlen
4. Anzahl Sonderzeichen
5. Anzahl Großbuchstaben
6. Anzahl Kleinbuchstaben
7. Wie Gemixed (z.B. nicht alle Zahlen am Ende)

und am Ende habt Ihr dann so ein Passwort:
***************************** :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
xXRobo_CubeXx
Beiträge: 120
Registriert: 12.06.2015 16:08
Computerausstattung: Version 5.41 LTS
Wohnort: Wohnort
Kontaktdaten:

Re: Suche Funktion zum zählen

Beitrag von xXRobo_CubeXx »

@Kukulkan
Leider kenn ich mich nich mit "JS" aus. kein plan :/
@Kurzer
genau so wollt ich es auch haben danke :allright:
@ts-soft
***************************** scheint aber kein sicheres PW zu sein....
Man kann seine PWs auch mit einfachen Wörter füllen wie ich das immer mache wie z.b. für das Pureboard: PureBoard_2015_xXRobo_CubeXx
Lässt sich viel besser merken und ist trotzdem sicher, langes PW, hat Buchstaben, Zahlen und sonderzeichen. :allright:
Version 5.41 LTS :)
Antworten