CRC-32 哈希的唯一性是否足以唯一标识包含文件名的字符串?

Is the uniqueness of CRC-32-hashes sufficient to uniquely identify strings containing filenames?

我已经对连接到字符串的文件名列表进行了排序,并希望通过唯一的校验和来识别每个这样的字符串。

这些字符串的大小最小为 100 字节,最大为 4000 字节,平均为 1000 字节。字符串的总数可以是任意的,但更可能在 ca 的范围内。 10000.

CRC-32 适合这个目的吗?

例如我需要以下每个字符串具有不同的固定长度(最好是短的)校验和:

"/some/path/to/something/some/other/path"
"/some/path/to/something/another/path"
"/some/path"
...
# these strings can get __very__ long (very long strings are the norm)

CRC-32哈希值的唯一性是否随着输入长度的增加而增加?

是否有更好的校验和选择?

没有

除非您的文件名都是四个字符或更少,否则无法保证 CRC 是唯一的。对于 10,000 个名称,其中至少两个具有相同 CRC 的概率约为 1%。

对于任何 32 位散列值都是如此。

为每个名字分配唯一代码的最佳方法是简单地从零开始为名字计算一个计数器,然后为每个名字递增,将计数器分配为该名字的代码。但是,这不会帮助您计算仅给出名称的代码。

您可以使用散列,例如 CRC 或其他一些散列,但您需要处理冲突。文献中有几种常见的方法。您将保留一个已分配名称的散列列表,如果发生冲突,您可以增加散列直到找到一个未使用的并分配那个。然后在查找名称时,您从计算的哈希开始并对该名称进行线性搜索,直到找到它或未使用的插槽。

至于散列,我会推荐XXH64。这是一个非常快的 64 位散列。您不需要此应用程序的加密哈希,这会不必要地慢。