Seite 1 von 1

SHA1 hexdigest validieren...

Verfasst: Freitag 10. August 2007, 10:55
von jens
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?

Verfasst: Freitag 10. August 2007, 14:32
von BlackVivi
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.

Verfasst: Freitag 10. August 2007, 17:46
von veers
Frage: Warum wird re.search und nicht re.match verwendet?!

Verfasst: Freitag 10. August 2007, 18:16
von EnTeQuAk
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!"

Verfasst: Freitag 10. August 2007, 18:28
von BlackJack
Da fehlt jetzt das '$' am Ende des regulären Ausdrucks.

Verfasst: Samstag 11. August 2007, 08:27
von EnTeQuAk
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

Verfasst: Samstag 11. August 2007, 08:38
von Trundle
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