【问题标题】:How to generate a unique integer id for string?如何为字符串生成唯一的整数 id?
【发布时间】:2018-11-30 16:45:02
【问题描述】:

我有一个长字符串列表,应该反复比较。我正在寻找的是一种基于字符串值生成唯一整数值​​的方法,该字符串具有最小的 RAM/CPU 使用率,并且可以完全信任。为相同的字符串生成值,应该总是返回相同的值。我知道有很多基于散列/加密机制的算法,但是它们使用大量资源,而且速度不够快。提前致谢。

【问题讨论】:

  • @Igor 哦,请不要,不要在这里推荐;这不是GetHashCode() 所做或意味着的
  • 您在这里可能遇到的大问题是:您所追求的并不是真正的哈希 - 听起来它甚至需要比加密哈希更可靠(加密哈希仍然会发生冲突)。如果您需要超过 40 亿个(ish)字符串,您也会遇到一个大问题,因为:这就是您拥有的 int 值的数量。您在这里基本上需要的是:一个大型的字符串查找数据库。
  • 这听起来像XY problem。你的最终目标是什么?你为什么要这样做? (你所说的“应该反复比较”是什么意思,分享你现有的实现或类似的东西也会有帮助
  • 显然,只有字符串本身是完全唯一的值 - 任何减少到整数都会有冲突。可接受的碰撞百分比是多少?你能像哈希表一样处理并在碰撞后验证匹配吗?

标签: c# c#-4.0 uniqueidentifier


【解决方案1】:

您可以使用某种检查 Sum 函数来处理字符串并为每个特定字符串生成一个唯一的数字。我在大型项目中为自己使用了一个函数,我希望它可以帮助

private string GetChecksum(string text)
        {
            long sum = 0;
            byte overflow;
            for (int i = 0; i < text.Length; i++)
            {
                sum = (long)((16 * sum) ^ Convert.ToUInt32(text[i]));
                overflow = (byte)(sum / 4294967296);
                sum = sum - overflow * 4294967296;
                sum = sum ^ overflow;
            }

            if (sum > 2147483647)
                sum = sum - 4294967296;
            else if (sum >= 32768 && sum <= 65535)
                sum = sum - 65536;
            else if (sum >= 128 && sum <= 255)
                sum = sum - 256;

            sum = Math.Abs(sum);

            return sum.ToString();
        }

【讨论】:

  • 感谢您的代码。似乎很快。您是否将它用于很多字符串?我需要它是独一无二的
猜你喜欢
  • 1970-01-01
  • 2013-02-09
  • 1970-01-01
  • 2021-07-08
  • 2011-01-12
  • 2018-12-10
  • 2015-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多