math - 一对一整数映射函数

标签 math hash cryptography

我们正在使用 MySQL 并开发一个应用程序,我们希望 ID 序列不公开...ID 几乎不是绝密,如果有人确实能够解码它们,那么也不存在重大问题。

所以,哈希当然是显而易见的解决方案,我们目前正在使用 MD5...32 位整数进入,我们将 MD5 修剪为 64 位,然后存储它。但是,我们不知道当您像这样修剪时发生冲突的可能性有多大(特别是因为所有数字都来自自动增量或当前时间)。我们目前检查冲突,但由于我们可能一次插入 100.000 行,因此性能很糟糕(无法批量插入)。

但最终,我们真的不需要哈希提供的安全性,它们会消耗不必要的空间,并且还需要额外的索引......那么,是否有任何简单且足够好的函数/算法可以保证任何数字的一对一映射,而没有明显的连续数字视觉模式?

编辑:我使用的 PHP 默认不支持整数算术,但环顾四周后我发现它可以用按位运算符廉价地复制。 32 位整数乘法的代码可以在这里找到:http://pastebin.com/np28xhQF

最佳答案

如果足够好的话,您可以简单地与 0xDEADBEEF 进行异或运算。

或者乘以奇数 mod 2^32。对于逆映射只需乘以 multiplicative inverse

示例:n = 2345678901;乘法逆元 (mod 2^32): 2313902621 对于映射只需乘以 2345678901 (mod 2^32):

1 --> 2345678901 2 --> 396390506

对于逆映射,乘以 2313902621。

关于math - 一对一整数映射函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7283631/

相关文章:

algorithm - 没有办法在网格中走 M 步

json - 如何清理进入 Sinatra 应用程序的所有参数?

java - 如何从 Android 应用程序中的 header 数据验证 Safety Net JWS 签名

python - 在 Charm-Crypto 中序列化和反序列化组元素

c - 在 C 中使用 crypt 进行简单密码比较

java - 什么是 Floyd's_cycle_finding_algorithm 以及在哪里可以有效地使用它?

math - 如何量化表面法线

java - 将均匀随机生成转换为二项式

arrays - 比较两个关联数组

algorithm - 如果存在,查找的最佳数据结构是什么?