C#增加用作整数计数器的字节数组的最快方法?

时间:2014-12-09 21:21:28

标签: c# arrays

我在并行CTR实现(加密)中使用分段整数计数器(字节数组)。计数器需要以与每个处理器正在处理的数据块相对应的大小递增。因此,该数字需要增加一个以上的比特值。换句话说..字节数组充当Big Integer,我需要用整数因子增加字节数组的和值。 我目前正在使用下面显示的方法使用while循环,但我想知道是否有一个有点明智的方法(& | ^ etc),因为使用循环似乎非常浪费..任何想法?

private void Increment(byte[] Counter)
{
    int j = Counter.Length;
    while (--j >= 0 && ++Counter[j] == 0) { }
}

/// <summary>
/// Increase a byte array by a numerical value
/// </summary>
/// <param name="Counter">Original byte array</param>
/// <param name="Count">Number to increase by</param>
/// <returns>Array with increased value [byte[]]</returns>
private byte[] Increase(byte[] Counter, Int32 Count)
{
    byte[] buffer = new byte[Counter.Length];

    Buffer.BlockCopy(Counter, 0, buffer, 0, Counter.Length);

    for (int i = 0; i < Count; i++)
        Increment(buffer);

    return buffer;
}

2 个答案:

答案 0 :(得分:2)

标准的O(n)多精度加法是这样的(假设[0]是LSB):

static void Add(byte[] dst, byte[] src)
{
    int carry = 0;

    for (int i = 0; i < dst.Length; ++i)
    {
        byte odst = dst[i];
        byte osrc = i < src.Length ? src[i] : (byte)0;

        byte ndst = (byte)(odst + osrc + carry);

        dst[i] = ndst;
        carry = ndst < odst ? 1 : 0;
    }
}

这可以帮助我们想到这是小学 - 算术的术语,实际上就是这样:

  129
+ 123
-----

请记住,从左(最低有效数字)开始,您为每个数字执行添加和携带的位置?在这种情况下,每个数字都是数组中的一个字节。

您考虑使用任意精度BigInteger而不是自己动手吗?它实际上是专门为.NET自己的加密内容创建的。

答案 1 :(得分:0)

我使用了Cory Nelsons答案的变体,它使用正确的endian顺序创建数组并返回一个新数组。这比首次发布的方法要快得多..感谢您的帮助。

private byte[] Increase(byte[] Counter, int Count)
{
    int carry = 0;
    byte[] buffer = new byte[Counter.Length];
    int offset = buffer.Length - 1;
    byte[] cnt = BitConverter.GetBytes(Count);
    byte osrc, odst, ndst;

    Buffer.BlockCopy(Counter, 0, buffer, 0, Counter.Length);

    for (int i = offset; i > 0; i--)
    {
        odst = buffer[i];
        osrc = offset - i < cnt.Length ? cnt[offset - i] : (byte)0;
        ndst = (byte)(odst + osrc + carry);
        carry = ndst < odst ? 1 : 0;
        buffer[i] = ndst;
    }

    return buffer;
}