目前我正在处理一个项目,其中一些信息需要进行哈希。由于数据集非常庞大(每天创建数百万条记录),因此数据转换算法必须快速。
需要哈希的数据块是固定长度的(11个十进制数字 - 例如:05018144298)。因此,我想知道是否值得创建自己的哈希函数,而不是使用一些现有的函数(例如MD5),以显著减少处理时间。如果确实如此,那么最好的方法是什么?是否可以修改某些现有算法(例如MD5,但将输入分成较小的块并修改其他参数以适应11位十进制数字的固定输入),还是最好从头设计哈希函数?
谢谢!
目前我正在处理一个项目,其中一些信息需要进行哈希。由于数据集非常庞大(每天创建数百万条记录),因此数据转换算法必须快速。
需要哈希的数据块是固定长度的(11个十进制数字 - 例如:05018144298)。因此,我想知道是否值得创建自己的哈希函数,而不是使用一些现有的函数(例如MD5),以显著减少处理时间。如果确实如此,那么最好的方法是什么?是否可以修改某些现有算法(例如MD5,但将输入分成较小的块并修改其他参数以适应11位十进制数字的固定输入),还是最好从头设计哈希函数?
谢谢!
在实际测量使用现有哈希函数是否确实具有非常重要的影响之前,性能方面做任何事情都不值得。在典型PC上,典型的MD5实现将能够每秒处理数百万个小消息,仅使用主CPU上的单个核心。你“每天数百万次”的机会是小菜一碟。
设计自己的哈希函数,同时保持哈希函数的安全特性,是一个非常糟糕的想法。目前,全球顶级密码学家正在参与由NIST组织的公开竞赛设计新的标准哈希函数。数十名非常专业的研究人员已经研究了几年,并将继续进行约两年的研究。一个孤立的程序员,对这个主题不是很专业,在几天或几周内试图做得更好,几乎是荒谬的。设计安全的哈希函数很困难。
对于您来说,正确的做法是使用现有的标准加密哈希函数。顺便说一下,那不是MD5;该函数已经发现了严重的弱点(实际上,自1996年以来已经发现了严重的弱点,并且在过去15年中未推荐使用MD5)。最好使用SHA-256。
如果您不需要哈希函数的加密属性,而只需要类似散列表索引的随机化函数,则任何哈希函数都足够好。只需进行分析,注意没有性能问题,并感到高兴即可。
long long int
)中。将该数字视为已经是哈希值是否可行?如果您的目标是隐藏个人身份信息(例如电话号码、社会安全号码等),那么哈希不是一个很好的解决方案。它总是容易受到彩虹表攻击,而且(正如其他人已经非常清楚地指出的那样)依赖于您自己开发的某些私有哈希函数将无法提供任何安全性。
制作一次性密码本(OTP)。这只是一个以个人身份识别号码为键的表格,第二列包含相同格式的随机数字。使用加密安全的 Windows CSP 或类似工具随机生成第二列,并由于定义在其上的唯一索引而保证其唯一性。
使用 OTP 将所有个人身份识别号码的实例替换为相应的随机等价物。完成后,丢弃 OTP。
此时,没有存储的秘密可以危及数据的隐私。事实上,您能够找出随机数对应的原始数据的唯一方法是拥有所有原始数据,即使这也不是轻松的事情。