Hash 散列与数字id';s

Hash 散列与数字id';s,hash,web-applications,Hash,Web Applications,当创建一个web应用程序时,它会显示一个重复实体的唯一标识符(YouTube上的视频,或像我这样的网站上的图书部分),最好使用一个统一长度的标识符,如散列或数据库中项目的唯一键(1、2、3等) 除了透露一些我认为无关紧要的应用程序内部信息之外,为什么使用散列比只使用唯一id更好 简而言之:哪一个更适合用作公开显示的唯一标识符-哈希值,还是数据库中的唯一键? 编辑:我再次打开这个问题,因为Dmitry提出了一个好的观点,即不要将命名绑定到db特定属性。这种束缚会阻止我在将来优化/规范数据库吗 该平

当创建一个web应用程序时,它会显示一个重复实体的唯一标识符(YouTube上的视频,或像我这样的网站上的图书部分),最好使用一个统一长度的标识符,如散列或数据库中项目的唯一键(1、2、3等)

除了透露一些我认为无关紧要的应用程序内部信息之外,为什么使用散列比只使用唯一id更好

简而言之:哪一个更适合用作公开显示的唯一标识符-哈希值,还是数据库中的唯一键?

编辑:我再次打开这个问题,因为Dmitry提出了一个好的观点,即不要将命名绑定到db特定属性。这种束缚会阻止我在将来优化/规范数据库吗


该平台将php/python与ISAM/w MySQL结合使用。

哈希值不能保证是唯一的,我相信也不能保证一致性。

如果我不想让用户猜到系列中的下一个ID,我通常会使用哈希值。但是对于您的图书部分,我会坚持使用数字id。

您的用户需要记住/使用该值吗?或者你是从安全角度看的


从安全角度来看,这不重要——因为你不应该仅仅依靠人们猜测他们不应该看到的东西的不同但有效的ID来阻止他们。

是的,我认为你不是在寻找散列-你更可能是在寻找Guid。如果你在.Net平台上,请尝试System.Guid


但是,不使用Guid的最重要原因是为了性能。对(长)字符串进行数据库连接和查找是非常不理想的。数字很快。因此,除非您真的需要它,否则不要这样做。

如果您出于某种原因需要重建数据库,例如,并且顺序发生变化,则最好使用哈希。序数将四处移动,但散列将保持不变

不是依赖于你把东西放进盒子里的顺序,而是依赖于东西的属性,看起来。。更安全

但是,很明显,要注意碰撞。

使用散列

  • 如有必要,您可以自由地将数据库与类似的数据库(或备份)合并
  • 没有做一些可以帮助一些猜测攻击的事情,哪怕是一点点
  • 没有透露更多关于用户的私人信息,例如,如果有人在您当前的数据库登录中看到用户编号2,他们会得到他是一个老人的信息
  • (如果你使用一个长的哈希或GUID,)如果你被YouTube收购,并且他们决定集成你的数据库,这将极大地帮助你自己
  • 如果出现按GUID索引的搜索引擎,请自便

  • 请让我们知道,过去6个月是否让您对这个问题有了一些明确的认识…

    除非您试图隐藏内部对象ID计数器的状态,否则哈希不必要的慢(生成和比较)、不必要的长、不必要的丑,以及不必要的冲突。guid同样又长又丑,这使得它们和散列一样不适合人类使用

    对于类似库存的东西,只需使用顺序(或分片)计数器即可。如果迁移到不同的数据库,只需将新计数器初始化为至少与现有最大记录ID相同的值。几乎每台数据库服务器都为您提供了这样做的方法


    如果您试图隐藏计数器的状态,可能是因为您正在计算用户数,不想让竞争对手知道您有多少,我建议避免显示您的内部ID。如果您坚持显示它们,不希望散列的缺点,可以考虑使用最大周期来生成IDS。

    < P>散列的优点在于,在检查数据库是否存在之前,您可以检查它们是否有效。这可以帮助您抵御使用随机哈希的攻击,因为您不需要用虚假查找来加重数据库的负担


    因此,如果您的散列具有某种定义良好的格式,例如末尾有一个校验和,您可以检查它是否正确,而无需转到数据库。

    它们是一致的,但您说它们不是唯一的(定义上存在冲突)。然而,通过在散列之前添加某种随机或模糊的salt(微时间或随机数),可以在很大程度上避免冲突。添加salt对冲突数没有影响。。。但如果每次都添加一个完全随机的数字,它们确实不一致!:-)即使有许多书是由不同的作者写的,也要坚持使用数字id?第一个作者将得到一组从1到20的数字,然后下一个作者将得到21到30的数字。这在任何方面都不好吗?不,这听起来像是典型的数据库索引。使用哈希使URL猜测变得更困难,但无论如何,您需要更好的安全性。除非您想隐藏它们在数据库中创建的顺序,或者可能是您拥有的计数。e、 g.是否有人需要知道您是用户id号8 vs 7000000。哈希不会生成“下一个id”,因此它不能替代数字id。除非您是指某个内容加上数字id的哈希。否则,可能会发生冲突。(假设32位对象散列,给定“随机”输入,预计65K项会发生冲突?)您需要一个GUID。实际上,从安全角度来看,这很重要。对于密码分析员来说,能够说出ID的顺序比偶尔遇到随机冲突要多得多。当然,这是假设有密码要分析。@Dmitry,顺序并不重要。独特性是这里的重要问题。如果您将一个连续整数列表导入到一个新的数据库中,它就可以正常工作。