模糊数据库ID
我有一个主键是自动增量的表。 我想要一个与主键关联的图像,但我不希望显示主键。 将图像命名为:
$filename = md5($primarykey + $secret_string) . '.jpg';
是一个好的解决方案?
我担心可能会发生碰撞,文件被覆盖。
另一个选项当然是生成一个随机字符串,检查它不存在作为一个文件,并将其存储在数据库中...但是,如果不需要,它不希望存储额外的数据。
另一个选项是逻辑转换youtube url风格,例如1 = a 2 = b但是有随机顺序,例如1 = x 2 = m ...但是有可能被解码...加上md5可能会比任何YouTube网址功能都要轻。
我想我正在处理超过200万条记录,那么碰撞的可能性是什么? 你会选择哪个选项,或者你能想出更好的方法?
真的有两个选择:
您通常可以使用以下选项: - 散列 - 随机生成的字符串 - UUID
哈希如果您选择哈希,请选择碰撞低发生率的东西。 另外,在做哈希时,考虑为什么要隐藏DB ID。 如果你正在哈希计算简单数字,那么有人不需要很长的时间就可以计算出你的哈希值,你绝对需要对它进行计算。 哈希散列的优点是快速生成和低冲突几率(在小的情况下绝对不需要验证这些,所以更快的插入)。 缺点是任何适当的实施将是SHA256或更好,这意味着它很长。 如果你想保存数据库/索引空间,那么你可以做一些十六进制转换,这可能不是你想要的。
随机字符串这可以产生任何适合你的长度,任何字符集或数字a-Z0-9。 这也意味着在URI中使用的较短字符串中的“更多”数据,REQUEST数据等。缺点是您必须检查它是否在数据库中。
一个UUID就像一个哈希,快速生成,相当低的碰撞几率,可以修改为“少”难看,然后纯输出。
我的建议不要这样做。 我之前不得不在一个非常大的实现中处理这个问题,这个实现从一个非常小的实现中发展而来。 最后,你开始做“聪明”的事情,比如创建完全唯一的标识符(例如内容类型+你的标识符),并开始看到它的一些价值,但你必须处理规模。 缩放这是非常困难的。 数据库针对ID作为主键进行了优化,如果您想要垂直扩展,则需要考虑大量的思考。 如果您必须,只能将其用于外部客户端交互。
使用线性同余发生器。 如果您正确选择了值,那么将会有一个非常大的周期的伪随机序列。 没有冲突,但请注意,这只是一种混淆方法,不会提供任何真正的安全性(但我认为这不是您要查找的内容)。
我想我正在处理超过200万条记录,那么碰撞的可能性是什么?
根据维基百科,您需要超过2 * 10 ^ 19个记录才能有50%的概率发生至少一次碰撞,所以我可以说你不必担心。
链接地址: http://www.djcxy.com/p/45157.html下一篇: Recommendation for a ASP.NET Webforms Validation Framework