45 lines
1.4 KiB
JavaScript
45 lines
1.4 KiB
JavaScript
|
|
/**
|
||
|
|
* Cross-platform crypto utilities
|
||
|
|
* Provides hashing functions that work in both Node.js and browser environments
|
||
|
|
*/
|
||
|
|
/**
|
||
|
|
* Simple string hash function that works in all environments
|
||
|
|
* Uses djb2 algorithm - fast and good distribution
|
||
|
|
* @param str - String to hash
|
||
|
|
* @returns Positive integer hash
|
||
|
|
*/
|
||
|
|
export function hashString(str) {
|
||
|
|
let hash = 5381;
|
||
|
|
for (let i = 0; i < str.length; i++) {
|
||
|
|
const char = str.charCodeAt(i);
|
||
|
|
hash = ((hash << 5) + hash) + char; // hash * 33 + char
|
||
|
|
}
|
||
|
|
// Ensure positive number
|
||
|
|
return Math.abs(hash);
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Alternative: FNV-1a hash algorithm
|
||
|
|
* Good distribution and fast
|
||
|
|
* @param str - String to hash
|
||
|
|
* @returns Positive integer hash
|
||
|
|
*/
|
||
|
|
export function fnv1aHash(str) {
|
||
|
|
let hash = 2166136261;
|
||
|
|
for (let i = 0; i < str.length; i++) {
|
||
|
|
hash ^= str.charCodeAt(i);
|
||
|
|
hash = (hash * 16777619) >>> 0;
|
||
|
|
}
|
||
|
|
return hash;
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Generate a deterministic hash for partitioning
|
||
|
|
* Uses the most appropriate algorithm for the environment
|
||
|
|
* @param input - Input string to hash
|
||
|
|
* @returns Positive integer hash suitable for modulo operations
|
||
|
|
*/
|
||
|
|
export function getPartitionHash(input) {
|
||
|
|
// Use djb2 by default as it's fast and has good distribution
|
||
|
|
// This ensures consistent partitioning across all environments
|
||
|
|
return hashString(input);
|
||
|
|
}
|
||
|
|
//# sourceMappingURL=crypto.js.map
|