SHA1 hexdigest validieren...

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 10. August 2007, 10:55

Aus dem Thread MD5 Summe überprüfen... hab ich folgende Variante gebastelt um ein SHA1 hexdigest zu validieren:

Code: Alles auswählen

def validate_sha_value(sha_value):
    """
    Check if the given >sha_value< is a possible SHA1 hexdigest ;)
    returned true or false
    
    >>> validate_sha_value("wrong length")
    False
    >>> validate_sha_value(1234)
    False
    >>> validate_sha_value("right length but not a SHA1 hexdigest!!!")
    False
    >>> validate_sha_value("0398bf140231dbfa1e0fb13421e176a1bb27bc72")
    True
    """
    if not (isinstance(sha_value, basestring) and len(sha_value) == 40):
        return False
    
    try:
        int(sha_value, 16)
    except (ValueError, OverflowError), e:
        return False
    else:
        return True
Hab nun eine neue Variante gefunden (ist von http://django-registration.googlecode.com ):

Code: Alles auswählen

SHA1_RE = re.compile('^[a-f0-9]{40}$')
if SHA1_RE.search(sha_value):
    print "OK"
else:
   print "False!"
Frage mich nun was besser ist??? Die RE Variante ist eindeutig kürzer, soviel steht fest ;)

Btw. das ganze brauche ich für mein SHA1-JavaScript-Login um per newforms die POST Daten zu überprüfen...

Was meint ihr?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Freitag 10. August 2007, 14:32

Ich würde persönlich immer die Variante vorziehen, bei der schneller ersichtlich ist, was passiert. Dann würde ich darüber nachdenken, inwiefern sie erweiterbar ist... dann würde ich schauen, ob der Quellcode mit der Variante noch gut lesbar bleibt und schlussendlich, wenn das Programm fertig ist und sowas, würd ich mir über Geschwindigkeit Sorgen machen.

Für mich ist die untere Variante wesentlich ersichtlicher.
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Freitag 10. August 2007, 17:46

Frage: Warum wird re.search und nicht re.match verwendet?!
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Freitag 10. August 2007, 18:16

Man kann natürlich auch `match` anstatt `search` benutzen. Dadurch wird die Regular Expression sogar um zwei Zeichen kürzer, denn `match` sucht grundsätzlich nur die ersten Zeichen ab und nicht, wie `search` den ganzen Text auf einen Treffer.

Die letze Variante finde ich auch einfach einfacher, weil A, kürzer und B, gleich ersichtlich ist, was sie macht.

Die Variante mit `match` anstatt `search`:

Code: Alles auswählen

In [7]: SHA1_RE = re.compile(r'[a-f0-9]{40}')

In [9]: def check_sha(key):
   ...:     if SHA1_RE.match(key):
   ...:         print "OK"
   ...:     else:
   ...:         print "False!"
BlackJack

Freitag 10. August 2007, 18:28

Da fehlt jetzt das '$' am Ende des regulären Ausdrucks.
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Samstag 11. August 2007, 08:27

Eigentlich nicht, denn in den Tests klappts wunderbar.

Was würde denn das fehlen des `$` auslösen?
Mit, matched er ja nur die aktuelle Zeile, würde bedeuten, das er `\n` mitmatched, sollte eines vorhanden sein?


MfG EnTeQuAk
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Samstag 11. August 2007, 08:38

EnTeQuAk hat geschrieben: Was würde denn das fehlen des `$` auslösen?

Code: Alles auswählen

In [9]: bool(re.match(r'[a-f0-9]{40}', 'a'*40 + 'sicher keine SHA1'))
Out[9]: True

In [10]: bool(re.match(r'[a-f0-9]{40}$', 'a'*40 + 'sicher keine SHA1'))
Out[10]: False
Antworten