2011-06-01 18 views
8

que estaba buscando MD5 para C++, y se dan cuenta de MD5 no se construye en (a pesar de que hay una gran cantidad de muy buenos bibliotecas para apoyar la función MD5). Entonces, me di cuenta de que realmente no necesito md5, cualquier método de hash servirá. Por lo tanto, me preguntaba si C++ tiene tales funciones? Quiero decir, funciones hash incorporadas?¿Algún método hash incorporado en C++?

Mientras yo estaba investigando para C++, vi Java, PHP, y algunos otros lenguajes de programación MD5. Por ejemplo, en PHP, solo necesita llamar al: md5("your string");.

Una función hash sencilla hará. (Si es posible, incluir algún código simple sobre cómo usarlo.)

+0

¿Qué tal crc32? http://stackoverflow.com/questions/302914/crc32-c-or-c-implementation – Rookie

+0

Pedir un "método hash" es bastante vago. ¿Necesitas un hash criptográfico? ¿O solo estás tratando de indexar una colección? ¿Necesitas resistencia a los ataques de complejidad algorítmica? Etcétera –

Respuesta

11

Esto es simple. Con C++ 11 se obtiene una

hash<string> 

funtor que se puede utilizar como esto (no probado, pero le da la idea):

hash<string> h; 
const size_t value = h("mystring"); 

Si usted no tiene C++ 11, eche un vistazo a impulso, tal vez boost::tr1::hash_map. Probablemente también proporcionen una función de hashing de cadena.

En casos muy simples que usted puede comenzar con algo como lo siguiente:

size_t h = 0 
for(int i=0; i<s.size(); ++i) 
    h = h*31 + s[i]; 
return h; 

para asumir el comentario más abajo. Para evitar cadenas cortas de la agrupación, puede inicializar h de forma diferente. Tal vez se puede utilizar la longitud de eso (pero eso es sólo mi primera idea, no probado):

size_t h = numeric_limits::max<size_t>()/(s.length()+1); // +1: no div-by-0 
... 

esto no debería ser peor que antes, pero todavía está lejos de ser perfecto.

+5

Tenga en cuenta que esta función hash tiende a agruparse cuando hay una gran cantidad de cadenas muy cortas. (No es algo frecuente, y es bastante bueno en la mayoría de los casos.) –

+0

@James: ¡muy buen punto! +1 – towi

+0

@JamesKanze ¿qué piensas de mi idea sobre la inicialización si h? – towi

8

Depende de la versión de C++ que tienen ... y qué tipo de función que busca hash.

C++ 03 no tiene ningún tipo de contenedor de hash, y por lo tanto no hay necesidad de hash. Sin embargo, varios compiladores han estado proponiendo encabezados personalizados. De lo contrario, Boost.Functional.Hash puede ayudar.

C++ 0x tiene la familia de recipientes unordered_, y por lo tanto un predicado std::hash, que ya funciona para tipos estándar C++ (incorporado en tipos y std::string, al menos).

Sin embargo, este es un hash simple, lo suficientemente bueno para los mapas hash, no para la seguridad.

Si está buscando un hash criptográfico, entonces el problema es completamente diferente (y md5 está descuidado), y necesitará una biblioteca para (por ejemplo) un hash SHA-2.

Si está buscando velocidad, consulte CityHash y MurmurHash. Ambos tienen restricciones, pero están muy optimizados.

+0

¿Entonces puede agregar especializaciones 'hash '? – xtofl

+2

Sí, +1 para "no por seguridad", ¡correcto! – towi

+0

@xtofl: sí, está destinado a ser utilizado como el actual 'std :: less', pero para los mapas hash. O simplemente puede pasar un predicado personalizado a un mapa hash determinado. –

Cuestiones relacionadas