@anglinb/city-hash (英语)
TypeScript执行Google的CityHash64算法——一种快而非晶体散列函数.
安装
npm install @anglinb/city-hash
使用量
import { cityHash64, cityHash64NumMax } from '@anglinb/city-hash';
// Hash a string
const hash1 = cityHash64("hello world");
console.log(hash1); // 12386028635079221413n
// Hash binary data
const data = new Uint8Array([1, 2, 3, 4, 5]);
const hash2 = cityHash64(data);
console.log(hash2); // 8996017160742164057n
// The result is always a BigInt
const hash3 = cityHash64("The quick brown fox jumps over the lazy dog");
console.log(hash3.toString()); // "16697807905646383735"
// Get a JavaScript-safe number (truncated to 53 bits)
const safeHash = cityHash64NumMax("hello world");
console.log(safeHash); // 1129659810357413 (safe JavaScript number)
API 密码
cityHash64(input: string | Uint8Array): bigint
使用Google的CityHash算法计算输入数据的64位散列.
参数:
input: 数据为散列. 可以是字符串还是字符串Uint8Array。 。 。 .
回返情况:
- 64位散列值为
BigInt。 。 。 .
cityHash64NumMax(input: string | Uint8Array): number
计算一个 CityHash64 已切换到 JavaScript 的 Number.MAX_SAFE_INTEGER (53位数).
参数:
input: 数据为散列. 可以是字符串还是字符串Uint8Array。 。 。 .
回返情况:
- 作为 Java 脚本的散列值
number,保证Number.MAX_SAFE_INTEGER。 。 。 .
当您需要使用 JavaScript 语境中需要常规数字而不是 BigInts 的散列值,例如 JSON 序列化或某些数据库操作时,此函数是有用的.
特征
- 快点: 优化速度并设计为散列表
- 高质量: 产生碰撞率低的分布良好的散列值
- 类型脚本: 带有适当类型定义的完整类型脚本支持
- 兼容:生产与最初C执行相同的产出
- 弹性: 接受字符串和二进制数据(Uint8Array)
关于CityHash
CityHash是由Google创建的散列函数家族,用于散列表和其他应用,速度比密码安全更重要. CityHash64特地出产64位散列值.
此项实施工作:
- 匹配 C 原执行的行为
- 处理字符串和二进制输入数据
- 在 JavaScript 中将 BigInt 用于适当的 64 位算术
- 接受全面测试
点击住宅集成
这个 cityHash64NumMax 函数旨在与 ClickHouse 数据库操作兼容。 以下是如何在 ClickHouse 中复制相同的短散列值:
直接 SQL 查询
-- Get the same result as cityHash64NumMax("hello world")
SELECT bitAnd(cityHash64('hello world'), 0x1FFFFFFFFFFFFF);
-- Result: 1129659810357413
创建 ClickHouse 函数
您可以在 ClickHouse 中创建用户定义的功能以匹配 cityHash64NumMax数字 :
-- Create a function that matches cityHash64NumMax
CREATE FUNCTION cityHash64NumMax AS (input) -> bitAnd(cityHash64(input), 0x1FFFFFFFFFFFFF);
-- Usage examples
SELECT cityHash64NumMax('hello world'); -- 1129659810357413
SELECT cityHash64NumMax('test string'); -- 7852960286803079
SELECT cityHash64NumMax('another example'); -- 6487172654247519
在表格操作中使用
-- Create a table with a hash column
CREATE TABLE user_events (
user_id String,
event_data String,
hash_value UInt64 MATERIALIZED cityHash64NumMax(event_data)
) ENGINE = MergeTree()
ORDER BY user_id;
-- Insert data (hash_value will be automatically calculated)
INSERT INTO user_events (user_id, event_data) VALUES
('user1', 'login'),
('user2', 'purchase'),
('user1', 'logout');
-- Query using the hash
SELECT * FROM user_events WHERE hash_value = cityHash64NumMax('login');
一致性核查
您可以验证您的 JavaScript 和 ClickHouse 执行结果相同 :
// JavaScript
import { cityHash64NumMax } from '@anglinb/city-hash';
const jsResult = cityHash64NumMax('test input');
console.log(jsResult); // e.g., 1234567890123
-- ClickHouse
SELECT bitAnd(cityHash64('test input'), 0x1FFFFFFFFFFFFF);
-- Should return the same value: 1234567890123
业绩
CityHash的设计快于现代处理器. 这种TypeScript执行保持了良好的性能,同时为TypeScript提供了安全和方便.
许可证
麻省理工学院
贷项
基于Geoff Pike和Jyrki Alakurijala在Google的最初CityHash算法.