Deseo enviar nombres de funciones de un sistema incrustado débil a la computadora host para fines de depuración. Como los dos están conectados por RS232, que tiene poco ancho de banda, no deseo enviar el nombre de la función literalmente. Hay unos 15 nombres de función de caracteres largos, y a veces quiero enviar esos nombres a una tasa bastante alta.Función hash para cadenas cortas
La solución en la que pensé fue encontrar una función hash que calificaría esos nombres de funciones con un byte único y solo enviaría este byte. La computadora host escanearía todas las funciones en la fuente, calcularía su hash usando la misma función y luego traduciría el hash a la cadena original.
La función hash debe ser
- colisión libre para cadenas cortas.
- Simple (ya que no quiero demasiado código en mi sistema integrado).
- ajustan a un solo byte
Obviamente, esto no tiene por qué ser seguro por cualquier medio, solamente libre de colisiones. Así que no creo que usar la función hash relacionada con la criptografía valga la pena su complejidad.
Un código de ejemplo:
int myfunc() {
sendToHost(hash("myfunc"));
}
El anfitrión sería entonces capaz de presentar con la lista de veces que se ejecutó la función myfunc
.
¿Existe alguna función hash conocida que cumpla las condiciones anteriores?
Editar:
- supongo voy a utilizar mucho menos de 256 nombres de función.
- Puedo usar más de un byte, dos bytes me tienen bastante cubierto.
- Prefiero usar una función hash en lugar de usar el mismo mapa de función a byte en el cliente y el servidor, porque (1) no tengo implementación de mapa en el cliente, y no estoy seguro de querer poner uno para fines de depuración. (2) Requiere otra herramienta en mi cadena de compilación para inyectar la tabla nombre-función en mi código de sistema incorporado. Hash es mejor en este sentido, incluso si eso significa que tendré una colisión de vez en cuando.
bien, un byte único significa que puede tener un máximo de 256 funciones diferentes nombres. ¿Es esto cierto para su sistema integrado? Además, si todos los nombres de las funciones son decididos y estáticos, ¿por qué no utiliza una enumeración para asignar un mapa a cada función? –
¿Ha considerado usar una o más de las siguientes funciones hash de propósito general: http://www.partow.net/programming/hashfunctions/index.html –