SimPHash/Src/Template/Schema.json

156 lines
6 KiB
JSON

2026-09-06 11:34:03 -05:00
{
2026-09-06 11:46:42 -05:00
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "SimPHash Config",
"description": "Config file consumed by SimPHash (see Src/Template/README.md for full parameter docs).",
"type": "object",
"properties": {
"max_attepms": {
"type": "integer",
"minimum": 1,
"description": "Maximum displacement attempts (seed values 0, 1, 2, ...) tried per bucket before giving up."
},
"namespace": {
"type": ["string", "null"],
"description": "Namespace the generated tables/function are wrapped in. Leave empty or null to skip."
},
"file_name_out": {
"type": "string",
2026-09-06 14:45:02 -05:00
"description": "Path of the .mqh file to generate."
2026-09-06 11:46:42 -05:00
},
"table_prefix": {
"type": "string",
"description": "Prefix used for all generated table names (<prefix>_seeds, <prefix>_hashes, <prefix>_values/<prefix>_tindex)."
},
"copyright": {
"type": "string",
"description": "Text written into the generated file's #property copyright."
},
"link": {
"type": "string",
"description": "Text written into the generated file's #property link."
},
"func_name": {
"type": "string",
"description": "Name of the generated lookup function."
},
"def_name_table_size": {
"type": "string",
"description": "Name of the #define for the final table size."
},
"def_bucket_size_name": {
"type": "string",
"description": "Name of the #define for the bucket count."
},
"invalid_value": {
"type": ["integer", "number", "string"],
"description": "Value returned by the generated function when a key isn't found (also used to fill unused slots)."
},
"comment_funct": {
"type": "boolean",
"description": "If true, the generated function body is wrapped in /* */ (useful when you only want the tables and will write the function yourself)."
},
"guard_name": {
"type": ["string", "null"],
"description": "Optional #ifndef/#define include guard name for the generated file."
},
"bin": {
"type": "object",
"description": "Optional: if present, the raw tables are also written as binary files.",
"properties": {
"seeds": { "type": "string", "description": "Output path for the seeds .bin file." },
"values": { "type": "string", "description": "Output path for the values .bin file." },
"meta": { "type": "string", "description": "Output path for the meta .bin file." },
"hash": { "type": "string", "description": "Output path for the hashes .bin file." }
},
"additionalProperties": false
},
"hash": {
"type": "object",
"description": "Bucket hash: converts each string key into a ulong before bucketing.",
"properties": {
"type": {
"type": "string",
"enum": ["TSN_PHASH_TYPE_FNV1A_64", "TSN_PHASH_TYPE_XXHASH_64"],
"description": "Bucket hash algorithm."
2026-09-06 11:34:03 -05:00
},
2026-09-06 11:46:42 -05:00
"config": {
"type": "object",
"description": "Algorithm-specific settings. Use 'basis'/'prime' for TSN_PHASH_TYPE_FNV1A_64, or 'seed' for TSN_PHASH_TYPE_XXHASH_64.",
"properties": {
"basis": {
"type": ["string", "integer"],
"description": "FNV-1a offset basis. Use the string 'def' for the standard FNV-1a-64 constant, or a numeric value to override it."
2026-09-06 11:34:03 -05:00
},
2026-09-06 11:46:42 -05:00
"prime": {
"type": ["string", "integer"],
"description": "FNV-1a prime. Use the string 'def' for the standard FNV-1a-64 constant, or a numeric value to override it."
2026-09-06 11:34:03 -05:00
},
2026-09-06 11:46:42 -05:00
"seed": {
"type": "integer",
"description": "xxHash64 seed (only used when hash.type is TSN_PHASH_TYPE_XXHASH_64)."
}
},
"additionalProperties": false
}
},
"required": ["type"],
"additionalProperties": false
},
"final_hash": {
"type": "string",
"enum": ["HASH_UL1_MUR_MUR", "HASH_UL1_SPLITMIX", "HASH_UL1_FMIX", "HASH_UL1_FIBBO"],
"description": "Final per-bucket displacement hash, applied to the already-bucketed ulong key plus a seed."
},
"perfect_hash": {
"type": "object",
"description": "Perfect-hash construction settings.",
"properties": {
"elements_por_bucket": {
"type": "number",
"exclusiveMinimum": 0,
"description": "Target average number of keys per bucket (lower = more buckets, generally faster to find a working seed)."
},
"load_factor": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 1,
"description": "Final table load factor (keys / final table size). Lower leaves more free slots, easing displacement at the cost of memory."
}
},
"required": ["elements_por_bucket", "load_factor"],
"additionalProperties": false
},
"map_use_value": {
"type": "boolean",
"description": "true = generate a values table (function returns the value directly). false = generate an indices table (function returns a position for you to index your own array with)."
},
"map": {
"description": "The key set. An object (KEY: value) when map_use_value is true, or an array of key strings when map_use_value is false.",
"anyOf": [
{
"type": "object",
"description": "Used when map_use_value: true — each key maps to the value the generated function should return.",
"additionalProperties": {
"type": ["integer", "number", "string"]
}
2026-09-06 11:34:03 -05:00
},
2026-09-06 11:46:42 -05:00
{
"type": "array",
"description": "Used when map_use_value: false — plain list of keys; the generated function returns each key's index.",
"items": { "type": "string" }
}
]
2026-09-06 11:34:03 -05:00
}
},
2026-09-06 11:46:42 -05:00
"required": [
"file_name_out",
"func_name",
"invalid_value",
"hash",
"final_hash",
"perfect_hash",
"map_use_value",
"map"
],
"additionalProperties": false
2026-09-06 11:34:03 -05:00
}