我有一个SQL表,它使用字符串作为密钥。我需要使用PHP将该字符串(最多18个字符)转换为唯一的(!)4字节整数。有人可以帮忙吗?
答案 0 :(得分:1)
唯一?不可能,抱歉。
让我们仔细看看:
有18个字符,即使我们假设只有128个可能的ASCII字符(7位),你也会得到128 ^ 18个可能的字符串(我甚至不会考虑更短字符串的可能性!),大概是8E37(8和37个零)。
使用4字节整数,你得到256 ^ 4个可能的整数,大约是4E9(40亿)。
所以,你有大约4E28个字符串而不是整数;你不能拥有独特的地图。
因此,一旦输入4294967297th键,您肯定会遇到碰撞,但只要输入多个键就可以碰到碰撞。
答案 1 :(得分:0)
将字符串的查找表保留为整数。每次遇到新字符串时,都会将其添加到映射表中并为其分配新的唯一ID。这将适用于大约2 ^ 32个字符串,这可能就足够了。
对于更多2 ^ 32个不同的字符串,没有办法做到这一点。
答案 2 :(得分:0)
你不能。一个四字节整数可以表示2 ^ 32 = 40亿个值,这不足以容纳目标空间。
如果表中当前的行数少于40亿,则可以创建一个只为每个行分配增量值的交叉表。使用这种方法,您可以限制为40亿行,但这可能适用于您的情况。