_sha importar en hashlib python

Bueno, hoy estaba revisando el módulo hashlib en Python, pero luego encontré algo que todavía no puedo entender.

Dentro de este módulo de Python, hay una importación que no puedo seguir. Yo voy así:

def __get_builtin_constructor(name): if name in ('SHA1', 'sha1'): import _sha return _sha.new 

Intenté importar el módulo _sha desde un shell de python, pero parece que no se puede alcanzar de esa manera. Mi primera suposición es que es un módulo C, pero no estoy seguro.

Así que dime chicos, ¿sabes dónde está ese módulo? ¿Cómo lo importan?

En realidad, shamodule.c proporciona el módulo _sha y md5module.c y md5.c proporcionan m_dm5.c, y ambos se crearán solo cuando tu Python no esté comstackdo con OpenSSL de forma predeterminada.

Puede encontrar los detalles en setup.py en su setup.py de código fuente de Python.

  if COMPILED_WITH_PYDEBUG or not have_usable_openssl: # The _sha module implements the SHA1 hash algorithm. exts.append( Extension('_sha', ['shamodule.c']) ) # The _md5 module implements the RSA Data Security, Inc. MD5 # Message-Digest Algorithm, described in RFC 1321. The # necessary files md5.c and md5.h are included here. exts.append( Extension('_md5', sources = ['md5module.c', 'md5.c'], depends = ['md5.h']) ) 

La mayoría de las veces, su Python está construido con la biblioteca Openssl y, en ese caso, esas funciones las proporciona las bibliotecas OpenSSL.

Ahora, si los quieres por separado, puedes construir tu Python sin OpenSSL o mejor aún, puedes construir con la opción pydebug y tenerlos.

Desde tu tarball de Python Source:

 ./configure --with-pydebug make 

Y ahí tienes:

 >>> import _sha [38571 refs] >>> _sha.__file__ '/home/senthil/python/release27-maint/build/lib.linux-i686-2.7-pydebug/_sha.so' [38573 refs] 

Parece que tu instalación de Python se ha comstackdo dentro de _haslib en lugar de _sha (ambos módulos C). Desde hashlib.py en python 2.6:

 import _haslib: ..... except ImportError: # We don't have the _hashlib OpenSSL module? # use the built in legacy interfaces via a wrapper function new = __py_new # lookup the C function to use directly for the named constructors md5 = __get_builtin_constructor('md5') sha1 = __get_builtin_constructor('sha1') sha224 = __get_builtin_constructor('sha224') sha256 = __get_builtin_constructor('sha256') sha384 = __get_builtin_constructor('sha384') sha512 = __get_builtin_constructor('sha512')