我正在寻找一个哈希函数,我可以用它为使用GSM调制解调器或以太网连接连接到我们网络的设备提供统一的唯一ID。
因此,对于任何给定的设备,我都可以使用IMEI number或MAC address硬编码来生成哈希值。
我在过去几个小时里一直在研究哈希函数,阅读我可能想要使用的不同的非加密和加密哈希值。我的重点是对性能的低冲突,因为哈希不会经常计算。
我的领跑者是MD5,FNV-1a,MurmurHash2,Hsieh和DJB。
无论我使用什么哈希都必须用C语言实现,并且将在具有微处理器的微控制器上使用。
我知道为你的需求选择一个好的哈希函数的诀窍就是知道你将要提供什么样的输入。
我问这个问题的原因是我的脑海中浮现出IMEI和MAC都有有限长度和范围的想法,所以也许存在一个相当简单的哈希函数,它可以覆盖两者的全部集合而不具备碰撞。 (因此,一个完美的哈希函数)
IMEI号是15位十进制数(十六进制为12-13字节?),MAC地址是6字节。仔细考虑它我不认为你会在两组输入数字之间发生碰撞,但如果这是错误的话,请随时纠正我。如果你做了,你能做些什么来阻止它吗?将一些种子添加到其中一个集合中?
我是否在正确的轨道上?是否可以为这些组合集找到完美的哈希函数?
谢谢!
更新
感谢您的回答和评论。我最终使用身份函数;)作为我的哈希函数,然后还使用掩码,因为数字集之间可能存在重叠。
IMEI,IMEISV和MAC都适合6.5字节或更少,所以我将我的值存储在7个字节中,然后在第一个字节上进行按位OR,并使用基于数字来源的掩码,确保它们在所有套装中都是独一无二的。
答案 0 :(得分:3)
没有办法对未知的,不断增长的输入集进行完美的哈希。您可以简单地使该字段比IMEI或MAC较大的字段大一些,并使用该位标记它是哪种类型的标识符,以及整个IMEI / MAC。任何较小的 会发生碰撞,但它们可能非常罕见。