数组的最佳哈希方法是byte什么?
这些数组是序列化的类对象,包含通过TCP/IP在应用程序之间传递的jpeg图像.
阵列大小约为200k.
有一种通过导入所述比较在.net两字节阵列的公知效率memcmp从功能msvcrt.dll,如所描述这里.
单声道中是否有等效的库导入?在linux或Windows上运行mono时需要有所不同吗?或者是否有另一种快速字节数组比较技术在单声道中运行良好?我正在寻找比在c#中迭代数组更好的东西.
更新
根据Matt Patenaude的评论,我认为这可能会很好:
#if __MonoCS__
[DllImport("c", CallingConvention = CallingConvention.Cdecl)]
#else
[DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
#endif
public static extern int memcmp(byte[] b1, byte[] b2, UIntPtr count);
Run Code Online (Sandbox Code Playgroud)
但我还没有尝试过.我以前从未在单声道上进行p/invoke.我正在使用pinvoke.net上推荐的签名.这会兼容吗?
寻找以单调为重点的答案.谢谢.
我试图比较VB.NET中的两个长字节数,并遇到了障碍.比较两个50兆字节的文件大约需要两分钟,所以我显然做错了什么.我在一台拥有大量内存的x64机器上,所以那里没有问题.这是我目前使用的代码,想要改变.
_Bytes并且item.Bytes是要比较的两个不同的数组,并且已经是相同的长度.
For Each B In item.Bytes
If B <> _Bytes(I) Then
Mismatch = True
Exit For
End If
I += 1
Next
Run Code Online (Sandbox Code Playgroud)
我需要能够尽可能快地比较可能数百兆字节甚至可能是一千兆字节或两千兆字节的文件.任何能够更快地完成此任务的建议或算法?
Item.bytes是从数据库/文件系统中取出的对象,它返回比较,因为它的字节长度与用户想要添加的项匹配.通过比较两个阵列,我可以确定用户是否已经向DB添加了新内容,如果没有,那么我可以将它们映射到另一个文件而不会浪费硬盘空间.
[更新]
我将数组转换为Byte()的局部变量,然后进行相同的比较,相同的代码并在一秒钟内运行(我必须对其进行基准测试并将其与其他人进行比较),但如果你对本地做同样的事情变量和使用通用数组变得非常慢.我不确定为什么,但它为我提出了更多关于数组使用的问题.
我在Code TimeStamps的Code First Entity Framework中有一个字节数组,映射如下:
[Column(TypeName = "timestamp")]
[MaxLength(8)]
[Timestamp]
public byte[] TimeStamps { get; set; }
Run Code Online (Sandbox Code Playgroud)
上述属性等于C#中的SQL服务器"timestamp"数据类型.
在SQL服务器中,我可以轻松比较"时间戳",如下所示......
SELECT * FROM tableName WHERE timestampsColumnName > 0x000000000017C1A2
Run Code Online (Sandbox Code Playgroud)
我希望在C#或Linq Query中实现同样的功能.在这里,我编写了我的Linq查询,该查询无法正常工作.
byte[] lastTimeStamp = someByteArrayValue;
lstCostCenter.Where(p => p.TimeStamps > lastTimeStamp);
Run Code Online (Sandbox Code Playgroud)
我也尝试过BitConverter比较一个双字节数组,这个数组也无法正常工作......
lstCostCenter.Where(p => BitConverter.ToInt64(p.TimeStamps, 0) > BitConverter.ToInt64(lastTimeStamp, 0));
Run Code Online (Sandbox Code Playgroud)
如何比较C#或Linq Query中的字节数组.
注意 - 我只是不想比较两个数组,就像使用SequenceEqual或任何其他方法只是比较并返回true或false.我希望Linq查询中的比较大于>或小于<运算符,它提供了正确的数据,如SQL Server查询.
我想有效地比较部分byte[]- 所以我理解memcmp()应该使用.
我知道我可以使用PInvoke来调用memcmp()- 在.NET中比较两个字节数组
但是,我想只比较byte[]使用偏移的部分,并且memcmp()因为它使用指针而没有偏移.
int CompareBuffers(byte[] buffer1, int offset1, byte[] buffer2, int offset2, int count)
{
// Somehow call memcmp(&buffer1+offset1, &buffer2+offset2, count)
}
Run Code Online (Sandbox Code Playgroud)
我应该使用C++/CLI来做到这一点吗?
我应该在IntPtr中使用PInvoke吗?怎么样?
谢谢.
假设我有一个byte[],想要检查所有字节是否为零。For循环是一种明显的实现方式,而LINQ All()是一种出色的实现方式,但最高性能至关重要。
如何使用Mono.Simd加速检查字节数组是否为零?我正在寻找最先进的方法,而不仅仅是正确的解决方案。
我是否忘记了显而易见的,或者是"手动"比较器最好的方法?
基本上,我只想比较类型(小)字节数组的内容.如果所有字节都匹配,则结果应为true,否则为false.
我期待找到那个Array.Equals或者Buffer.Equals会有所帮助.
示范代码:
var a = new byte[]{1, 2, 3, 4, 5};
var b = new byte[]{1, 2, 3, 4, 5};
Console.WriteLine(string.Format("== : {0}", (a == b)));
Console.WriteLine(string.Format("Equals : {0}", a.Equals(b)));
Console.WriteLine(string.Format("Buffer.Equals : {0}", Buffer.Equals(a, b)));
Console.WriteLine(string.Format("Array.Equals = {0}", Array.Equals(a, b)));
Console.WriteLine(string.Format("Manual_ArrayComparer = {0}", ArrayContentsEquals(a, b)));
Run Code Online (Sandbox Code Playgroud)
手动功能:
/// <summary>Returns true if all elements of both byte-arrays are identical</summary>
public static bool ArrayContentsEquals(byte[] a, byte[] b, int length_to_compare = int.MaxValue)
{
if (a == null || …Run Code Online (Sandbox Code Playgroud) 有人可以帮我理解160位(SHA-1)哈希中最重要的字节是什么吗?
我有一个C#代码调用加密库来计算数据流中的哈希码.结果我得到一个20字节的C#数组.然后我从另一个数据流计算另一个哈希码,然后我需要按升序放置哈希码.
现在,我正在努力了解如何比较它们.显然我需要从另一个中减去一个,然后检查结果是否为负,正或零.从技术上讲,我有2个20字节的数组,如果我们从内存角度看一下开头的最低有效字节(较低的内存地址)和最后的最高有效字节(较高的内存地址).另一方面,从人类阅读的角度来看它们,最重要的字节在开头,最不重要的是在结尾,如果我没有弄错,这个顺序用于比较GUID.当然,如果我们使用一种或另一种方法,它将给我们不同的顺序.哪种方式被认为是比较哈希码的正确或传统方式?在我们的情况下,这一点尤为重要,因为我们正在考虑实现一个应该与现有的哈希表兼容的分布式哈希表.
我已经编写了一个测试方法,用于比较一个类的两个实例(给出了类型兼容性的假设).我自豪地检查了所有的公共财产,确保返回一个差异列表.
问题是某些属性是包含自己属性的对象(子属性,如果可以的话).通过逐步完成流程,我可以看到,这些都没有被比较.
如何设计深入调用并比较所有子属性的调用?如果方法相对简单,额外奖励.:)
public static class Extensions
{
public static IEnumerable<string> DiffersOn<Generic>(
this Generic self, Generic another) where Generic : class
{
if (self == null || another == null)
yield return null;
Type type = typeof(Generic);
IEnumerable<PropertyInfo> properties = type.GetProperties(
BindingFlags.Public | BindingFlags.Instance);
foreach (PropertyInfo property in properties)
{
var selfie = type.GetProperty(property.Name).GetValue(self);
var othie = type.GetProperty(property.Name).GetValue(another);
if (selfie != othie && (selfie == null || !selfie.Equals(othie)))
yield return property.Name;
}
}
}
Run Code Online (Sandbox Code Playgroud) 嗨,我正在尝试找到在 C# 中比较两个双精度数组的最快方法。如果合适,很高兴使用不安全。我在字节比较解决方案中看到的最大问题之一是,我不想将双精度数组复制到字节数组来进行 pinvoke。如果有一种将双精度数组视为字节数组以传递给 pinvoke memcmp 调用的高性能方法,那就太好了。
这是我所指的字节数组比较解决方案。 比较 .NET 中的两个字节数组
我的目标是比迭代和比较两个双数组中的元素更快。
作为参考,我的问题需要比较这些数组大约 10 万亿次。计算的这一部分约占操作总数的 30%,因此可以在此处进行大量节省。
目前我们运行 .NET 4.6 - 4.8。