Función hash para datos de string en C#

Pregunta: Escriba código en C# para aplicar hash a una serie de claves y muéstrelas con su código hash.

Respuesta: Hashtable es una estructura de datos ampliamente utilizada para almacenar valores (es decir, claves) indexados con su código hash. El código hash es el resultado de la función hash y se utiliza como valor del índice para almacenar una clave. Si dos claves distintas tienen el mismo valor, la situación se denomina colisión y una buena función hash minimiza las colisiones.

Pregunta: ¿Cómo elegir una función hash apropiada para los datos?

Respuesta: Si sus datos consisten en números enteros, la función hash más fácil es devolver el resto de la división de la clave y el tamaño de la tabla. Es importante mantener el tamaño de la tabla como un número primo. Pero se pueden escribir funciones más complejas para evitar la colisión. Si sus datos consisten en strings, puede agregar todos los valores ASCII de los alfabetos y modular la suma con el tamaño de la tabla (el código a continuación muestra lo mismo).

Ejemplo 1:

// C# Program to create a Hash 
// Function for String data
using System;
  
class Geeks {
      
    // Main Method
    public static void Main(String []args)
    {
          
        // Declaring the an string array
        string[] values = new string[50];
        string str;
  
        // Values of the keys stored
        string[] keys = new string[] {"Alphabets", 
              "Roman", "Numbers", "Alphanumeric", 
                                  "Tallypoints"};
  
        int hashCode;
  
        for (int k = 0; k < 5; k++) {
              
            str = keys[k];
              
            // calling HashFunction
            hashCode = HashFunction(str, values);
  
            // Storing keys at their hashcode's index
            values[hashCode] = str;
        }
  
        // Displaying Hashcodes along with key values
        for (int k = 0; k < (values.GetUpperBound(0)); k++) {
              
            if (values[k] != null)
                Console.WriteLine(k + " " + values[k]);
        }
    }
  
    // Defining the hash function
    static int HashFunction(string s, string[] array)
    {
        int total = 0;
        char[] c;
        c = s.ToCharArray();
  
        // Summing up all the ASCII values 
        // of each alphabet in the string
        for (int k = 0; k <= c.GetUpperBound(0); k++)
            total += (int)c[k];
  
        return total % array.GetUpperBound(0);
    }
}
Producción:

11 Tallypoints
16 Alphanumeric
19 Roman
34 Alphabets
46 Numbers

Ejemplo 2:

// C# Program to create a Hash 
// Function for String data
using System;
  
class Geeks {
      
    // Main Method
    public static void Main(String []args)
    {
          
        // Declaring the an string array
        string[] values = new string[50];
        string str;
  
        // Values of the keys stored
        string[] keys = new string[] {"C", "C++", 
                 "Java", "Python", "C#", "HTML"};
  
        int hashCode;
  
        for (int k = 0; k < 5; k++) {
              
            str = keys[k];
            hashCode = HashFunction2(str, values);
  
            // Storing keys at their hashcode's index
            values[hashCode] = str;
        }
  
        // Displaying Hashcodes along with key values
        for (int k = 0; k < (values.GetUpperBound(0)); k++) {
              
            if (values[k] != null)
                Console.WriteLine(k + " " + values[k]);
        }
    }
  
    // Defining the hash function
    static int HashFunction2(string s, string[] array)
    {
        long total = 0;
        char[] c;
        c = s.ToCharArray();
  
        // Horner's rule for generating a polynomial 
        // of 11 using ASCII values of the characters
        for (int k = 0; k <= c.GetUpperBound(0); k++)
          
            total += 11 * total + (int)c[k];
  
        total = total % array.GetUpperBound(0);
          
        if (total < 0)
            total += array.GetUpperBound(0);
  
        return (int)total;
    }
}
Producción:

6 C#
15 C++
18 C
19 Python
28 Java

Explicación: en HashFunction , pasamos los argumentos como una string para que se convierta en hash y los datos de la string ‘ valores ‘. El método ToCharArray convierte la string en la array de caracteres y luego comenzamos un ciclo for desde el principio hasta el final de la array de caracteres. Dentro del ciclo for calculamos la suma total de los valores ASCII de cada carácter en la array. El método GetUpperBound devuelve el valor del índice más alto de la array. Luego, la función hash devuelve el módulo de la suma total por el límite superior de la array (en este caso, 49 desde la string [] valores = nueva string [50] ). Mientras que en HashFunction2, estamos pasando los mismos argumentos pero es menos probable que esta función tenga colisiones. Todo es básicamente lo mismo, excepto que aquí usamos la regla de Horner para calcular la función polinomial de 11.

Publicación traducida automáticamente

Artículo escrito por ManasiKirloskar y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *