Perl的完美哈希函数(如gperf)?

Perl的完美哈希函数(如gperf)?,perl,hash,perfect-hash,Perl,Hash,Perfect Hash,我将使用key:value存储,并希望在Perl中创建不可冲突的散列。是否有一个Perl模块或函数可用于生成不可冲突的哈希函数或表(可能类似于)?我已经知道输入值的范围。我找不到纯Perl解决方案,最接近的是。如果要在XS中执行此操作,则使用gperf可能比使用gperf更合适。CMPH似乎针对非平凡的密钥大小和运行时生成进行了优化 在Perl中运行时生成完美哈希函数的成本可能会超过使用它的价值。为了获得好处,您需要对其进行编译和缓存。同样,编写一个XS模块在XS编译时从一个固定键列表生成函数可

我将使用key:value存储,并希望在Perl中创建不可冲突的散列。是否有一个Perl模块或函数可用于生成不可冲突的哈希函数或表(可能类似于)?我已经知道输入值的范围。

我找不到纯Perl解决方案,最接近的是。如果要在XS中执行此操作,则使用gperf可能比使用gperf更合适。CMPH似乎针对非平凡的密钥大小和运行时生成进行了优化

在Perl中运行时生成完美哈希函数的成本可能会超过使用它的价值。为了获得好处,您需要对其进行编译和缓存。同样,编写一个XS模块在XS编译时从一个固定键列表生成函数可能是最好的方法


出于好奇,您的数据有多大?集合包含多少个键?

您可能会感兴趣。它不是一个哈希表实现,但它应该是一个非常有效的关联数组实现


请注意,Perl的散列经过了很好的调整,当一个存储桶开始变大时,它们会自动被重新格式化。

Ah。阅读理解失败。抱歉…不,太酷了。感谢您让我更好地理解了在Perl中构建哈希的速度:-)我可能最终会在XSI中使用gperf,我正在了解哈希是如何工作的,所以目前这似乎是一种方式。我将使用它作为key:value存储中的键,可能是LevelDB。基本上,我需要一个key:value或multi-key:value存储,以便在高写入速率实时系统上对一个键执行简单的重复数据消除计数(聚合)。密钥在24小时内计数,然后将该聚合转储到CSV文件中,并在当天删除该存储。我要存储的数据长度约为1k,每条记录的总长度超过2G/天。钥匙很长;大约30个字符和一些整数。我不知道这是否可行。@EhevuTov我强烈建议您在处理完美的散列算法之前,首先使用股票数据库分析系统的性能。除非您的数据是病态的,而且我怀疑LevelDB的股票散列算法相当不错,否则散列冲突不太可能成为您的瓶颈。@EhevuTov在阅读LevelDB时,从性能角度来看,它最明显的问题是“一次只有一个进程(可能是多线程的)可以访问特定的数据库”这极大地限制了您对数据的访问、并行工作的能力,或者在这个问题上投入更多的硬件。您可能希望从一个不那么简单的数据库开始,因为它是一个繁重的写I/O系统,所以如果我在I/O上抛出更多线程,我认为这会降低性能,而不会提高性能。我会用某种类型的散列池来处理散列。我正在考虑将SQLite和MongoDB作为替代方案,但我怀疑它们是否会那么快。谢谢大家的提醒。我可能会用朱迪做另一个项目。我在一个实时系统上工作,所以重新哈希对我不好。看起来我可能还需要为散列创建工作进程。我还不知道该怎么做。