guid可以成为一个好的分区键吗?

时间:2011-07-25 18:43:22

标签: c# scalability guid scale partitioning

我必须在多台计算机上存储许多千兆字节的数据。这些文件由Guid唯一标识,一个文件只能在一台计算机上托管。我想知道我是否可以使用Guid作为分区键来确定我应该使用哪台机器来存储数据。如果是这样,我的分区功能是什么?

否则,我怎么能以这样的方式对数据进行分区,使得所有机器都得到非常相似的负载呢?

谢谢!

P.S。我没有使用Sql Server,Oracle或任何其他数据库。这是所有内部代码。 P.S.S. Guid是使用.NET函数Guid.NewGuid()生成的。

3 个答案:

答案 0 :(得分:4)

詹姆斯在评论中说,你需要一些分布均匀的东西。 Guids没有这个属性。我会推荐一个哈希,即使是像Guid本身的哈希一样简单。

SHA-1哈希具有良好的分布。除非你打算只在两台机器之间分配,否则我不推荐偶数/奇数哈希。

答案 1 :(得分:0)

因为GUID是随机的,你可以通过在一台机器上存储奇数GUID而在另一台机器上存储偶数GUID来分发它们......

static void Main(string[] args)
{
    var tests = new List<Guid>();

    for (int i = 0; i < 100000; i++)
    {
        tests.Add(Guid.NewGuid());
    }

    Console.WriteLine("Even: " + tests.Where(g => g.ToByteArray().Last() % 2 == 0).Count());
    Console.WriteLine("Odd : " + tests.Where(g => g.ToByteArray().Last() % 2 == 1).Count());
    Console.ReadKey(true);
}

给出几乎相等的分布。

修改

实际上,当分割超过2台机器时,这将不起作用,尽管您可以再次将其他字节拆分为奇数或偶数。

答案 2 :(得分:0)

如果你想循环你的发行版,我会考虑一个同步计数器的可能性,你用经典的循环方式计算你拥有的机器数量。

同步计数器可以是数据库中的一个字段,可以是单个Web服务,也可以是网络上的文件等。每次放置文件时都可以递增。