Ray1ee01's picture
Add runnable ChartPipeline Space
216c0a4 verified
Raw
History Blame Contribute Delete
1.75 kB
// Deterministic pseudo-random helpers for stable D3 renders.
(function (root) {
const chartUtils = root.chartUtils;
const random = chartUtils.random;
random.hashString = value => {
let hash = 2166136261;
const text = String(value == null ? "" : value);
for (let i = 0; i < text.length; i++) {
hash ^= text.charCodeAt(i);
hash = Math.imul(hash, 16777619);
}
return hash >>> 0;
};
random.seed = (jsonData, salt = "") => {
const data = jsonData && jsonData.data ? jsonData.data : {};
const columns = Array.isArray(data.columns) ? data.columns : [];
const rows = Array.isArray(data.data) ? data.data : [];
return random.hashString([
salt,
jsonData && jsonData.name,
jsonData && jsonData.chart_name,
rows.length,
JSON.stringify(columns.map(column => [
column && column.name,
column && column.role,
column && column.data_type,
])),
].join("|"));
};
random.generator = (jsonDataOrSeed, salt = "") => {
let state = typeof jsonDataOrSeed === "number"
? jsonDataOrSeed >>> 0
: random.seed(jsonDataOrSeed, salt);
return () => {
state = (state + 0x6D2B79F5) >>> 0;
let t = state;
t = Math.imul(t ^ (t >>> 15), t | 1);
t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
};
};
random.value = (jsonData, salt = "") => random.generator(jsonData, salt)();
random.id = (jsonData, salt = "") => random.seed(jsonData, salt).toString(36);
})(globalThis);