Estoy implementando una biblioteca openpeeps.com para Flutter en la que el usuario puede crear sus propios píos para usarlos como avatar dentro de nuestro producto.
Una de las razones detrás del uso de píos como avatar es que (en teoría) se puede almacenar fácilmente como un valor único dentro de una base de datos.
Una Peep
dentro de mi biblioteca contiene hasta 6 PeepAtoms
:
class Peep {
final PeepAtom head;
final PeepAtom face;
final PeepAtom facialHair;
final PeepAtom? accessories;
final PeepAtom? body;
final PeepAtom? pose;
}
Actualmente, A PeepAtom
es solo un nombre que identifica el archivo de imagen subyacente necesario para crear un Peep
:
class PeepAtom {
final String name;
}
¿Cómo obtener un hachís?
Lo que me gustaría hacer ahora es obtener un valor único de Peep
( int
o string
) que pueda almacenar en una base de datos. Si recupero los datos, me gustaría deconstruir el valor en átomos únicos para poder representar las imágenes de átomos apropiadas para mostrar el Peep. Si bien no estoy realmente buscando optimizar el tamaño de almacenamiento, sería bueno si el tamaño de byte fuera pequeño.
Como normalmente no trabajo con esas cosas, no tengo idea de cuál es la mejor opción. Estas son mis (ingenuas) ideas:
Peep.toJson
y convierte la salida a base64
. Probablemente ineficiente debido a un montón de caracteres innecesarios.PeepAtom.hashCode
para cada campo dentro de a Peep
y sube esto. Como una matriz que sería de 64 bits = 8 bytes * 6 (átomos). Eso está bastante bien, pero ni un solo valor.^
poner esto en un int. Sin embargo, creo que esto realmente no funcionaría porque necesitaría un identificador único y dado que estoy generando código PeepAtom
dentro de mi código, probablemente sería bastante complejo.¿Alguna idea/algoritmo mejor?
No estoy seguro de lo que quieres decir con "bastante complejo". Parece bastante simple empaquetar sus átomos en un doble.
Tenga en cuenta que esto de ninguna manera es un "hash". Un hash es una operación con pérdidas. Supongo que desea recuperar los datos originales.
Según su descripción, necesita siete bits para cada átomo. Pueden variar en 0..98 (ya que dijiste "menos de 100"). Un doble tiene 52 bits de mantisa. Tus seis átomos necesitan 42 bits, por lo que encaja fácilmente. Para los átomos que pueden ser null
, solo dale un valor especial de 7 bits sin usar, como 127.
Ahora solo usa multiplicar y sumar para combinarlos. Usa módulo y divide para sacarlos. P.ej:
double val = head;
val = val * 128 + face;
val = val * 128 + facialHair;
...
Extraer:
int pose = val % 128;
val = (val / 128).floorToDouble();
int body = val % 128;
val = (val / 128).floorToDouble();
...
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras