目前我正在开展一个必须对某些信息进行哈希处理的项目。由于数据集非常庞大(每天创建数百万条记录),因此数据转换算法必须快速。
必须进行散列的数据是固定长度(11个十进制数 - 例如:05018144298)。所以我想知道的是,是否值得创建自己的哈希函数而不是使用一些现有的(例如MD5)以显着减少处理时间,如果是,那么最好的方法是什么呢? 。这是修改一些现有算法的好方法(例如MD5但是将输入分解为较小大小的块并修改其他参数以获得11个十进制数的固定输入)或者从头开始设计散列函数是否更好? / p>
谢谢!
答案 0 :(得分:4)
在您实际测量使用现有哈希函数确实具有一些不可忽视的影响之前,在性能方面做任何事都是不值得的。在典型的PC上,典型的MD5实现将能够使用主CPU上的单个核心处理数百万个每秒的小消息。有可能你的“每天数百万”是小菜一碟。
设计自己的哈希函数,同时保持哈希函数的安全功能,是一个非常糟糕的主意。目前,世界顶级密码学家参与了NIST组织的open competition新标准哈希函数的设计。数十名非常专业的研究人员已经研究了几年,并将继续这样做两年多。一个单独的程序员,在这个主题上不是很专业,试图在几天或几周内做得更好,接近荒谬。设计安全散列函数是 hard 。
对您而言,正确的做法是使用现有的标准加密哈希函数。顺便说一句,这不是MD5;在这个职能中发现了严重的弱点(实际上,1996年左右发现了严重的弱点,过去15年来MD5一直未被推荐)。你最好使用SHA-256。
如果您不需要哈希函数的加密属性,而只需要一种类似哈希表的索引的随机化函数,那么任何哈希函数都足够好。只需对其进行分析,请注意没有任何性能问题,并且要开心。
答案 1 :(得分:2)
不要尝试创建自己的哈希或加密算法。如果你不是这个领域的专家,你可能会搞砸它。使用由真正了解他们正在做什么的人开发的现有算法,由知道他们正在做什么以及经过试验和测试的人实施。
话虽如此,我不清楚你想要哈希:
如果是11位数的单个数字,则可以将该数字存储为64位整数(C中为long long int
)。是否可以选择将该数字视为哈希?
如果它是一个11-tupel,例如11个32位数字,那么请使用系统支持的现有算法,如MD5,SHA-1或whichever algorithm you like,例如:通过OpenSSL。 OpenSSL还支持利用CPU的专用加密芯片和扩展(如所有MMX变体,但甚至是用于加速几个处理器提供的AES等算法的专用扩展),因此速度不应成为问题。 / p>
答案 2 :(得分:1)
如果您的目标是隐藏个人身份信息(例如电话号码,社会安全号码等),那么哈希不是一个很好的解决方案。它总是容易受到彩虹表行的攻击,并且(正如其他人已经非常清楚地指出的那样)根据您自己开发的一些私有散列函数,您将无法获得安全性。
制作一次性垫(OTP)。这只是一个以个人身份识别号码为主的表格,第二列包含相同格式的随机数。第二列是随机生成的(使用Windows CSP中的加密安全RNG或类似的东西),并且由于其上定义了唯一索引,因此保证是唯一的。
使用OTP将个人可识别号码的所有实例替换为相应的随机等效值。完成后,扔掉OTP。
此时,没有可能危及数据隐私的存储秘密。事实上,你可以弄清楚随机数对应的唯一方法是你是否拥有所有的原始数据,即使这样也不是那么简单。