ruby - Cómo agregar un valor a un hash existente sin una clave


Necesito asignar los números 0-100000 a un hash sin dar una clave.

Ruby usa Murmur como función hash. ¿Cómo puedo agregar un valor sin tener una clave, como en C, dejándolo manejar la colisión y otras cosas? ¿Es posible? ¿Puedo darle solo el valor al hash y dejar que evalúe la clave y luego insertarlo en sí mismo?

En una operación hash normal, tenemos una función hash y una tabla. Usamos el valor como argumento de la función hash, luego obtenemos una clave a cambio. ElEl valor se inserta en la ubicación de la clave en la tabla (si ocurre una colisión, se usa doble hashing o algo más).

¿Es posible hacer el mismo tipo de hashing en Ruby? ¿O estoy atascado con las formas predeterminadas? ¿Puedo simplemente arrojar el valor en una función, luego evalúa la clave e inserta el valor en la tabla hash o no?



------------Respuesta------------

Simplemente guárdelo en el hash usando el hash calculado de la clave, en lugar de la clave misma:

hash[hash_func(key)] = value

JEs decir, en lugar de asignar clave -> valor directamente, esto asigna hash_func (clave) -> valor. La implementación puede pasar el valor de su clave hash a través de otra función hash internamente, pero eso no es necesario que le importe.

Sin embargo, en los comentarios ahora sale a la luz que desea aplicar la función hash al valor, no a cualquier otra clave. En ese caso, solo use un conjunto y termine con eso. Luego, todo lo que necesita hacer es agregar valores al conjunto:

s = Set.new
s.add(value)

No hay necesidad de calcular el hash of cualquier cosa; Set se encargará de ello por ti.

En resumen, este parece ser un caso del Problema XY. Necesitaba almacenar un conjunto de valores en una estructura de datos (y presumiblemente poder verificar si esos valores se almacenaron de manera eficiente). En lugar de preguntar sobre esto, preguntó sobre funciones hash y tablas. Si hubiera preguntado sobre lo que realmente necesitaba, en lugar de preguntar sobre otra cosa que pensó que podría usar para resolver el problema original, habría tenido una respuesta útil.respuesta mucho más rápida.



------------Respuesta------------

La solución común es simplemente usar el valor como clave. Por lo tanto:

value = "xxx"
hash[value] = 1

De esta manera, documenta claramente que los valores reales (todos 1) de este hash en particular no sirven y obtendrá valores desduplicados. Hash hará el hashing habitual internamente, no necesita preocuparse por eso en absoluto.

Utilizo 1 como valor aquí, pero el valor real es completamente irrelevante. No uso nil ya que esa es la definición.valor devuelto por defecto de hash[nonexistant_value].

Si sus valores son más complejos, consulte http://docs.ruby-lang.org/en/2.0.0/Hash.html para obtener información específica sobre ellos.

Etiquetas: hash ruby

Artículos relacionados:

informes jasper: cómo publicar CVC (componente de visualización personalizado) en el servidor JasperReports

Reindexar elasticsearch 2.3.3 cuando se usa Java NodeClient