【问题标题】:What's the best way to hash a string vector not very long (urls)?散列不太长的字符串向量(url)的最佳方法是什么?
【发布时间】:2011-04-21 09:10:36
【问题描述】:

我现在正在处理 url 分类。我用“/?”等对 url 进行分区,生成一堆部分。在这个过程中,我需要将第一部分哈希到第 k 部分,比如 k=2,然后对于“http://stackoverflow.com/questions/ask”,键是一个字符串向量“stackoverflow.com questions” .目前,哈希类似于哈希。但它会消耗大量内存。我想知道 MD5 是否可以提供帮助或是否有其他选择。实际上,我不需要精确地恢复密钥,只要区分不同的密钥即可。 谢谢!

【问题讨论】:

  • Currently, the hash is like Hash. - 我不明白你的意思。什么是消耗大量内存、存储哈希码或计算它们?
  • 如果您尝试围绕查找/散列进行优化,这里还有一些需要考虑的事项。您的应用程序将大部分时间/内存花在哪里 - 生成哈希或查找它们?当您的列表接近无穷大(或您的存储桶大小)时,您将遇到某种形式的冲突。你的应用程序可以处理这个吗?如果不能,那么您可能会在某些时候遇到此错误,并且可能很难调试。如果可以并且经常发生,那么您可能需要研究能够为您的数据提供良好分布的散列算法。

标签: c++ hash


【解决方案1】:

占用大量内存

如果您的代码已经可以运行,您可能需要考虑保持原样。如果您没有目标,您将不知道何时完成。你确定在你的情况下“很多”是“太多”的同义词吗?

如果您决定确实需要更改您的工作代码,您应该考虑您可用的各种选项,而不是听信别人对特定算法的看法:

不确定内存影响,它肯定会改变您的性能配置文件,但您也可以考虑使用 Tries:

http://en.wikipedia.org/wiki/Trie

【讨论】:

    【解决方案2】:

    MD5 对于安全性不是问题的东西来说是一个很好的哈希码。它速度快且相当长(对于大多数应用程序来说,128 位就足够了)。分布也很好。

    Adler32 将是一个可能的替代方案。它很容易实现,只需几行代码。它甚至比 MD5 更快。它对于许多应用程序来说足够长/足够好(尽管对于许多应用程序来说不是)。 (我知道 Adler32 严格来说不是哈希码,但它仍然适用于许多应用程序)

    但是,如果存储哈希码会消耗大量内存,您可以随时截断哈希码,或使用 XOR 来“缩小”它。例如

    uint8_t md5[16];
    GetMD5(md5, ...);
    
    // use XOR to shrink the MD5 to 32 bits
    for (size_t i = 4; i < 16; i++)
        md5[i % 4] ^= md5[i];
    
    // assemble the parts into one uint32_t
    uint32_t const hash = md5[0] + (md5[1] << 8) + (md5[2] << 16) + (md5[3] << 24);
    

    我个人认为 MD5 会有点矫枉过正。看看Adler32,我觉得可以。


    编辑

    我必须纠正自己:对于短字符串(少于几千字节),Adler23 是一个相当糟糕的选择。我完全忘记了这一点。但总有一个显而易见的:CRC32。不如 Adler23 快(与 MD5 的速度差不多),但仍然易于实现,而且还有大量现有的实现,其中包含各种许可证。

    【讨论】:

    • +1。 Adler32 看起来是一个不错的选择。它似乎符合我认为他的需求(执行散列函数时内存消耗低,并输出 32 位 int)。有许多其他选项适合相同的配置文件,但它看起来很容易实现和调试,并且可能工作得很好。
    【解决方案3】:

    如果您只是想确定两个 URL 是否相同,您是否考虑过存储服务器 IP 地址的二进制版本?如果两个服务器名称解析为同一个地址,这对您的应用程序来说是错误的还是有好处的?

    【讨论】:

    • 我不能假装知道他的需求,但是在他试图分别存储由同一服务器提供服务的两个 url 的情况下,这肯定行不通。
    • 不过有一个问题:URL:IP 不是 N:1 映射,而是 N:N。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多