Métricas emoji de CreepJS: conjuntos y sumas
Interpreta emojiSet y textMetricsSystemSum en el código de CreepJS. Distingue representantes, agregación con pérdida e inclusión de campos de la identidad del SO.
BotBrowser Team
Quieres la documentación estructurada de Huella digital?
Este artículo forma parte de la biblioteca editorial. Para pasos de configuración, material de referencia y actualizaciones continuas, entra en la sección de docs.
Las métricas emoji de CreepJS describen la geometría del texto y cómo la biblioteca la agrupa. Los nombres emojiSet y textMetricsSystemSum no convierten esas mediciones en un certificado de sistema operativo. BotBrowser documenta fuentes basadas en perfiles y sustitución tipográfica para emojis, pero no promete valores idénticos en todas las métricas de texto ni establece un SO a partir de un resumen de CreepJS.
La evidencia pertinente es el código público de la revisión 10aa6724cd33a1015db1574211890518cd04f0cc, inspeccionado el 2026-11-02. El bloque de canvas citado selecciona representantes y calcula una suma; el bloque de ensamblaje decide qué campos conservar. Ninguno asigna una etiqueta de SO. Es una interpretación del código, no una comparación ejecutada en navegadores ni una afirmación sobre todas las inferencias realizadas en otras partes de CreepJS.
Resumen
emojiSetconserva el primer emoji encontrado para cada tupla distinta de siete métricas de texto. No es una lista completa de compatibilidad con emojis.textMetricsSystemSumagrega tuplas métricas únicas, en lugar de ponderar cada emoji de entrada por separado. El resumen pierde información.- El ensamblador comprueba
liedpara los campos de píxeles yliedTextMetricspor separado para los campos métricos. La ausencia requiere contexto de la rama. - Una geometría igual no establece píxeles iguales, el mismo archivo de fuente ni el mismo SO. Un clasificador de SO necesitaría evidencia adicional ajena a estos bloques.
- Compara revisión, composición de las métricas y etapa de inclusión antes de comparar resúmenes. Evita introducir material de huellas en los registros rutinarios de soporte.
Contenido
- Siete métricas describen geometría
- Los representantes no son un inventario de compatibilidad
- Una suma descarta la estructura que resume
- Píxeles y métricas tienen condiciones distintas
- La comparación de informes necesita procedencia
- Los controles tipográficos de BotBrowser tienen un alcance menor
- Conclusión práctica
Siete métricas describen geometría
El objeto medido no es una imagen
El código de canvas de CreepJS fijado a una revisión llama a context.measureText(emoji) y lee siete propiedades: actualBoundingBoxAscent, actualBoundingBoxDescent, actualBoundingBoxLeft, actualBoundingBoxRight, fontBoundingBoxAscent, fontBoundingBoxDescent y width. Une esos valores en una representación de tupla. Esa tupla, y no la imagen pintada del emoji, se convierte en la clave de deduplicación.
La referencia de measureText de MDN describe el objeto TextMetrics devuelto. La referencia de TextMetrics distingue la anchura de avance de las medidas de los límites y describe sus unidades en píxeles CSS. Por tanto, igualar solo width es menos exigente que igualar las siete propiedades seleccionadas. Ninguna comparación incluye los colores individuales ni los píxeles de borde de un glifo renderizado.
La distinción importa cuando dos informes afirman que un emoji «coincide». Uno puede referirse a igual anchura; otro, a la misma tupla seleccionada; un tercero, a una imagen renderizada. Son comparaciones diferentes con entradas distintas. La explicación de las huellas por medición de texto separa geometría, salida rasterizada y estado de carga de fuentes. Una afirmación de igualdad debe nombrar la capa y evitar trasladar una igualdad métrica a la imagen.
La selección de fuentes es otra dependencia
La especificación de selección de CSS Fonts describe la elección de fuentes y las alternativas. El nombre de una familia solicitada no demuestra por sí solo que todos los caracteres procedan de un archivo de fuente. La geometría obtenida mediante measureText() no es, por ello, un inventario de archivos. Comparar tuplas no recupera una ruta de selección no registrada por el mero hecho de que un nombre de familia figure en la configuración del canvas.
La especificación de emojis de Unicode distingue las solicitudes de presentación textual y de emoji. La presentación y la sustitución tipográfica aportan contexto, pero las propiedades TextMetrics seleccionadas siguen midiendo la disposición del texto resultante. Una nota de soporte no debería sustituir la secuencia de entrada real por una captura visualmente parecida: la semejanza visual no conserva la solicitud de presentación original.
Los representantes no son un inventario de compatibilidad
La selección sigue la tupla, no un veredicto de compatibilidad
En src/canvas/index.ts:369-394, CreepJS mantiene el conjunto pattern. Un emoji entra en emojiSet solo cuando su tupla de dimensiones no ha aparecido antes. Si una entrada posterior produce una tupla ya vista, no añade otro representante. Su omisión de emojiSet es compatible con una medición correcta; la rama no exige un veredicto de glifo no compatible.
Una agrupación hipotética muestra la consecuencia. Supongamos que dos cadenas de entrada diferentes producen la misma geometría seleccionada y otra produce una tupla distinta. Los representantes conservan un miembro del primer grupo y uno del segundo. Eso no demuestra que el miembro descartado no estuviera disponible ni que los conservados identifiquen dos archivos de fuente. La regla de agrupación solo considera la igualdad de las propiedades seleccionadas.
El orden también tiene un papel limitado pero importante. Como emojiSet recibe el primer miembro encontrado de cada patrón nuevo, cambiar el orden de entrada puede cambiar el representante elegido aunque la colección de tuplas únicas permanezca igual. Una diferencia entre listas de representantes no basta para demostrar un cambio de entorno. Primero hay que establecer que la revisión del código y la secuencia de entrada son comparables.
Matriz del código a la afirmación
La siguiente matriz sirve para interpretar el código, no es una salida del navegador. Cada fila expresa la conclusión máxima que permite esa etapa; no se puede atribuir un clasificador posterior a una etapa anterior solo porque consuma sus datos.
| Etapa | Operación del código | Objeto producido | Interpretación respaldada | Atajo no respaldado |
|---|---|---|---|---|
| Medición | Leer siete propiedades TextMetrics | Tupla geométrica | Geometría textual seleccionada | Identidad del SO |
| Deduplicación | Añadir tuplas nuevas a pattern | Patrones distintos | Diferentes medidas seleccionadas | Archivos de fuente distintos |
| Selección de representantes | Conservar el primer miembro de cada patrón | emojiSet | Representantes de grupos métricos | Compatibilidad completa con emojis |
| Agregación | Resumir las tuplas únicas | textMetricsSystemSum | Resumen métrico con pérdida | Identidad reversible del dispositivo |
| Ensamblaje del resultado | Comprobar liedTextMetrics por separado | Campos métricos incluidos | Decisión de inclusión propia del código | Veredicto de un servicio externo |
Esta regla resuelve un error habitual: no contar los miembros de emojiSet como fuentes instaladas ni los ausentes como glifos fallidos. Si la pregunta trata de un mensaje ilegible, el número de grupos métricos no responde si la secuencia prevista se muestra correctamente. Examina el problema visible en una aplicación autorizada en vez de tratar un campo de huella como una prueba de compatibilidad de glifos.
Una suma descarta la estructura que resume
Grupos únicos, no ponderaciones por frecuencia
La agregación de src/canvas/index.ts:396-399 recorre pattern, el conjunto de representaciones de tuplas únicas. Las entradas repetidas que producen una tupla existente no aportan otra copia en esa etapa. Por tanto, el total no mide con qué frecuencia la colección de entradas utilizó una geometría determinada. Suponer que cada entrada original contribuye por igual describe otro algoritmo.
La conversión y la reducción también comprimen varias distinciones. La implementación publicada convierte los componentes de la tupla en números y aplica cero cuando la conversión numérica produce un valor falso antes de sumar. Un resultado que llega al resumen no demuestra que cada propiedad seleccionada estuviera presente con un valor finito distinto de cero. La disponibilidad de las propiedades originales y el resumen numérico son hechos separados; este último no reconstruye la primera.
La suma pierde la disposición de los valores. Tuplas diferentes pueden tener el mismo total, y colecciones distintas de tuplas pueden compartir agregado. Es un argumento sobre la pérdida de información al sumar, no una tasa de colisiones observada ni una población de navegadores medida. La mera existencia de la suma no proporciona porcentajes de unicidad, confianza de identificación ni precisión de clasificación del SO.
La generación de píxeles sigue otra ruta
El módulo de canvas también produce datos renderizados, pero textMetricsSystemSum no es un resumen de todos los píxeles de una imagen emoji. La comparación métrica y la de píxeles deben conservar nombres de resultado distintos. Un informe que llama a ambas «canvas coincidente» no permite distinguir igualdad de disposición e igualdad rasterizada, aunque el colector original sí mantuviera la distinción.
El análisis de la semilla de canvas de CreepJS aborda solicitudes de dibujo deterministas y su relación con el resultado renderizado. No sustituye la pregunta sobre agrupación métrica: una secuencia de dibujo conocida no determina qué tuplas de texto se agrupan. A la inversa, una geometría representativa igual no demuestra solicitudes de dibujo, imágenes ni procesos posteriores de agregación idénticos.
En una comparación autorizada de compatibilidad, conserva la pregunta real. Si el incidente consiste en saltos de línea inesperados, importan width y el contexto de disposición. Si consiste en un emoji ilegible, importa el glifo visible. Un agregado puede señalar una diferencia de informe sin explicar ninguno de esos fallos. Sustituir el incidente por una puntuación de huella descartaría la evidencia necesaria para corregir la aplicación.
Píxeles y métricas tienen condiciones distintas
La inclusión no es un único interruptor para todo canvas
El ensamblaje fijado del resultado retorna sin resultado si falta el resultado de módulo canvas2d entrante. Cuando existe, trata dos condiciones de forma independiente. La rama !lied incluye dataURI, paintURI, textURI y emojiURI. La rama !liedTextMetrics incluye textMetricsSystemSum y emojiSet.
La negación de JavaScript importa: tanto !lied como !liedTextMetrics admiten cualquier valor falso en contexto booleano, no solo el booleano literal false. El código describe condiciones de inclusión; no permite convertir una marca ausente en una validación ejecutada. Asimismo, lied y liedTextMetrics son identificadores de la biblioteca, no conclusiones sobre la honestidad o intención de una persona.
La segunda rama conserva los datos ensamblados por la primera o inicia un objeto nuevo cuando faltan. Por tanto, los campos métricos pueden incluirse aunque la rama de píxeles no haya rellenado sus campos. Un exportador que combine ambos casos en una sola etiqueta de «canvas rechazado» elimina una distinción presente en el código citado.
Los campos omitidos necesitan el registro circundante
| Evidencia disponible | Interpretación acotada | Evidencia que sigue faltando |
|---|---|---|
No llega resultado canvas2d | Este bloque retorna sin ese resultado de módulo | Por qué falta el resultado |
| Rama de píxeles excluida y rama métrica incluida | Los grupos se tratan de forma independiente | Cualquier clasificación de SO o comparación de píxeles |
| Existe resultado de módulo, pero la condición métrica no admite campos | La inclusión métrica se retuvo en esta etapa | Si una exportación posterior también modificó datos |
Un informe descargado carece de emojiSet | El campo no es visible en el informe inspeccionado | Resultado de módulo, rama de inclusión e historial de exportación |
Son casos derivados del código, no ejecuciones reproducidas. En particular, la ausencia de emojiSet en un informe descargado no permite elegir la tercera fila sin el resultado de módulo y el estado de la rama. Filtrado de exportación, cambios de esquema y resultado de módulo no disponible siguen siendo posibilidades distintas. Sitúa la observación en la capa inspeccionada en lugar de deducir un evento anterior a partir de un campo final vacío.
La comparación de informes necesita procedencia
La revisión forma parte de la comparación
Registra la revisión fija de CreepJS junto al nombre del campo. 10aa6724cd33a1015db1574211890518cd04f0cc identifica el código leído aquí; una URL de rama móvil no establece que otro informe usara las mismas propiedades o el mismo ensamblador. Una fecha tampoco demuestra qué bytes sirvió una página. Esta limitación existe aunque dos exportaciones muestren etiquetas idénticas.
La etapa de observación debe acompañar a la revisión. Un objeto de módulo canvas, el objeto de huella ensamblado y un informe descargado pueden exponer campos distintos. Antes de interpretar la ausencia de textMetricsSystemSum, identifica qué objeto contiene el adjunto de soporte y si una transformación eliminó o renombró algo. Si no se conservó esa procedencia, deja la causa sin resolver en lugar de inventar un historial de ejecución.
Para una comparación permitida de registros existentes, la tabla define una nota mínima de procedencia. Son campos sugeridos de soporte, no un formato de exportación de CreepJS ni registros emitidos automáticamente por BotBrowser. Guarda solo lo necesario para el propósito de soporte; un enlace a un adjunto controlado por el usuario puede ser preferible a copiar vectores métricos en la analítica rutinaria.
| Campo de soporte | Pregunta que responde | Límite de recopilación |
|---|---|---|
| Revisión del código | ¿Qué implementación se interpreta? | Fijar la revisión real, no una rama actual supuesta |
| Etapa del objeto | ¿Módulo, objeto ensamblado o registro exportado? | No inferir un estado anterior no observado |
| Composición métrica | ¿Se eligieron las mismas siete propiedades? | Registrar el esquema antes de recopilar valores originales |
| Semántica de representantes | ¿Primer miembro de cada tupla única? | No renombrar representantes como compatibilidad tipográfica |
| Síntoma visible | ¿Salto de línea, glifo ausente o cambio solo de informe? | Separar el problema de aplicación de la identidad |
Una etiqueta de SO necesita evidencia propia
Ninguno de los bloques citados contiene el paso de clasificación que falta. Un informe que añade una etiqueta de SO necesita identificar por separado la regla, sus entradas y la evidencia de validación. Ver textMetricsSystemSum junto a esa etiqueta no demuestra que la suma la determinara de forma única; una etiqueta de un componente posterior tampoco es una conclusión documentada por measureText().
Las afirmaciones sobre poblaciones exigen otra categoría de evidencia. Inspeccionar código no establece la frecuencia de un valor entre usuarios reales ni si una versión del navegador cambia esa distribución. No se realizó aquí un estudio poblacional. La palabra informal «system» del nombre de variable no equivale a precisión de identificación medida, estabilidad entre dispositivos ni garantía de que instalaciones diferentes nunca compartan el valor.
Los controles tipográficos de BotBrowser tienen un alcance menor
La documentación tipográfica de BotBrowser describe inventarios de fuentes basados en perfiles, renderizado entre plataformas y sustitución de emojis apropiada para la plataforma. Son capacidades del producto, no afirmaciones del repositorio CreepJS, MDN o Unicode. La misma página admite que algunas medidas de disposición pueden diferir; un ajuste de perfil no garantiza el mismo resultado para todos los glifos o propiedades métricas.
Una aplicación autorizada puede usar un perfil declarado al comprobar un requisito concreto de disposición o renderizado. La aceptación debe nombrar ese requisito: si el mensaje previsto sigue siendo legible o si una línea conocida se ajusta al diseño. No debería sustituir la corrección de la aplicación por «CreepJS infirió el SO previsto», ni deducir una carga correcta del perfil a partir de un emojiSet coincidente.
La documentación y la interpretación del código responden a preguntas diferentes. La página explica capacidades de configuración y límites. La matriz anterior explica cómo una implementación pública reduce métricas y admite campos. Mantener los ámbitos separados evita convertir un control del producto en una promesa sobre un clasificador externo, o presentar un campo de un colector externo como una salida documentada de BotBrowser.
Preguntas frecuentes
¿Un emojiSet más corto significa menos emojis compatibles?
No. La selección del bloque citado depende de tuplas métricas nuevas. Varias entradas medibles pueden compartir una tupla y dejar solo el primer representante en emojiSet. Un inventario de compatibilidad exigiría otra prueba y evidencia sobre los glifos previstos; el número de representantes no aporta ese resultado.
¿Sumas iguales demuestran el mismo sistema operativo?
No. textMetricsSystemSum comprime tuplas únicas y descarta su disposición. Los dos bloques citados no asignan etiquetas de SO y no se afirma una validación poblacional de navegadores. Un clasificador posterior necesita evidencia propia; la igualdad del agregado no autentica un SO, dispositivo físico ni persona.
¿Por qué pueden quedar métricas cuando faltan campos de píxeles?
El ensamblador comprueba lied y liedTextMetrics por separado. La rama métrica puede crear un objeto aunque la de píxeles no haya aportado ninguno. Esa ruta explica una combinación posible de campos; no establece qué ruta siguió un informe descargado sin la evidencia circundante del módulo y la exportación.
Fuentes
- CreepJS: módulo canvas fijado
- CreepJS: ensamblaje de resultado fijado
- MDN: CanvasRenderingContext2D.measureText()
- MDN: TextMetrics
- CSS Fonts: algoritmo de selección de fuentes
- Unicode: especificación de emojis
- BotBrowser: documentación tipográfica
Conclusión práctica
Interpreta emojiSet como representantes de geometrías únicas y textMetricsSystemSum como un resumen con pérdida; después identifica la etapa de inclusión antes de explicar un campo ausente. Conserva revisión y procedencia del objeto en las comparaciones autorizadas. Usa evidencia directa de la aplicación para fallos de renderizado y evidencia justificada por separado para cualquier etiqueta de SO: estos bloques no aportan un inventario de compatibilidad ni una identidad de dispositivo.
Este artículo forma parte de la guía: ¿Qué es la huella digital del navegador?
Artículos Relacionados
Fingerprinting por medicion de texto: rastreo subpixel
Huella digitalInforme WebGL de CreepJS: contextos y señales
Huella digitalPredicción CreepJS: agregación y estados desconocidos
Huella digital¿Qué es la huella de fuentes? Coherencia de texto entre plataformas
Huella digitalHuella getClientRects: coherencia de DOMRect
Huella digitalInforme Intl de CreepJS: campos y valores ausentes
Lleva BotBrowser de la investigación a producción
Usa estas guías para entender el modelo y después avanzar hacia validación multiplataforma, contextos aislados y despliegue de navegador preparado para escalar.