【问题标题】:Create a unique 4-byte Integer number from a String in PHP在 PHP 中从字符串创建一个唯一的 4 字节整数
【发布时间】:2012-02-27 18:13:36
【问题描述】:

我有一个使用字符串作为键的 SQL 表。我需要使用 PHP 将该字符串(最多 18 个字符)转换为唯一的(!)4 字节整数。有人可以帮忙吗?

【问题讨论】:

  • 如何将 18 字节的字符串放入 4 字节的整数中?
  • 没有。没有足够的 4 字节整数来覆盖所有可能的字符串。
  • 18 个字符的字符串有 18 个字节。您说“max. 18 个字符”,因此有更多的组合,然后是所说的 18 个字节。现在您想将 18 字节压缩为 4 字节。这可能会持续一段时间,但不会持续太久。
  • 即使你能保证输入的字符串只使用了64个字符的范围,你也只能保证16个字符的唯一性。
  • 连 Jon Skeet 都做不到。

标签: php string integer unique


【解决方案1】:

独一无二?不可能,抱歉

让我们仔细看看:

对于 18 个字符,即使我们假设只有 128 个可能的 ASCII 字符(7 位),您也会得到 128^18 个可能的字符串(我什至不考虑更短字符串的可能性!),大约是 8E37(8 和 37 个零)。

使用 4 字节整数,您将获得 256^4 个可能的整数,大约为 4E9(40 亿)。

所以,字符串比整数多 4E28 个;你不能有一个唯一的映射。

因此,一输入第4294967297个键肯定会发生碰撞,但输入多个时可能会遇到一个。

另请参阅:http://en.wikipedia.org/wiki/Pigeonhole_principle

【讨论】:

    【解决方案2】:

    保持一个字符串到整数的查找表。每次遇到新字符串时,都将其添加到映射表并为其分配一个新的唯一 ID。这将适用于大约 2^32 个字符串,这可能就足够了。

    对于超过 2^32 个不同的字符串,无法做到这一点。

    【讨论】:

    • 不是唯一的,最终会有碰撞。 OP 要求唯一的映射。
    • 这个独一无二的。最多 2^32 个键。正如我所说。这是对理论上无法解决的问题的实际答案。没错。
    • 好吧,但是您没有重新发明 SQL 的自动增量键吗?
    • 我刚刚回答了 OP 的要求。我不知道他为什么不使用自动递增值,但肯定是有原因的。事实上,我会为映射表使用以下模式:(ID int auto_increment, StringValue nvarchar(400) unique)。
    【解决方案3】:

    你不能。一个四字节整数可以表示 2^32 = 40 亿个值,这不足以容纳您的目标空间。

    如果您目前在表中的行数少于 40 亿,您可以创建一个交叉表,为每个行分配一个增量值。使用这种方法,您将被限制为 40 亿行,但这可能适合您的情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多