小编Hug*_*une的帖子

字符串的持久哈希码

我想为字符串生成一个整数哈希码,它将永远保持不变; 即相同的字符串应始终产生相同的哈希码.

散列不必是加密安全的,它不会用于密码或敏感数据.

我的第一次尝试是使用.net框架string.GetHashCode()函数.但是在阅读消息来源后,我发现了以下内容:

// We want to ensure we can change our hash function daily. 
// This is perfectly fine as long as you don't persist the
// value from GetHashCode to disk or count on String A 
// hashing before string B.  Those are bugs in your code.
hash1 ^= ThisAssembly.DailyBuildNumber;
Run Code Online (Sandbox Code Playgroud)

这似乎表明哈希码不会保持不变.

如果是这样,框架是否有另一种方法来生成可重复的哈希码?或者GetHashCode的代码是否是实现我自己的代码的合理起点?

我正在寻找尽可能轻巧和快速的东西.
我找到了System.Security.Cryptography.MD5,但对于一个简单的int32哈希码来说这似乎有点过头了,我担心开销.至少它需要从字符串转换为字节数组,从字节数组转换为int,并MD5()为每个散列创建新对象,或管理某些静态共享MD5对象().

c# string hash hashcode gethashcode

8
推荐指数
1
解决办法
4148
查看次数

找到矩阵中具有某些属性的所有矩形区域

给定一个n*m矩阵,其可能的值为1,2和null:

  . . . . . 1 . .
  . 1 . . . . . 1
  . . . 2 . . . .
  . . . . 2 . . .
  1 . . . . . 1 .
  . . . . . . . .
  . . 1 . . 2 . .
  2 . . . . . . 1
Run Code Online (Sandbox Code Playgroud)

我正在寻找所有块B(包含(x0,y0)和(x1,y1)之间的所有值):

  • 包含至少一个'1'
  • 不包含'2'
  • 不是具有上述属性的另一个块的子集

例:

块

红色,绿色和蓝色区域都包含"1",没有"2",并且不是更大区域的一部分.当然,在这张图片中有超过3个这样的块.我想找到所有这些块.

找到所有这些区域的快速方法是什么?

我有一个工作强力解决方案,迭代所有可能的矩形,检查它们是否符合前两个标准; 然后迭代所有找到的矩形,删除另一个矩形中包含的所有矩形; 我可以通过先删除连续相同的行和列来加快速度.但我相当确定有一种更快的方式.

algorithm complexity-theory rectangles

7
推荐指数
1
解决办法
715
查看次数

将3D点云与CAD模型匹配

我有一个物体的点云,用激光扫描仪获得,以及该物体的CAD表面模型.

如何将点云与曲面相匹配,以获得云与模型之间的平移和旋转?

我想我可以对表面进行采样并尝试使用迭代最近点(ICP)算法将得到的采样点云与扫描仪点云进行匹配.

这实际上有用吗?

这项任务有更好的算法吗?

algorithm 3d computer-vision object-recognition point-clouds

7
推荐指数
2
解决办法
1万
查看次数

用确切的时间戳记录音频

我想在 Android Wear 设备上录制原始音频,并将其与其他传感器数据(例如加速度计)完全同步。要录制原始音频,我使用AudioRecord,但如何确定音频流任何部分的正确时间戳?

基本问题是我从缓冲区获取原始音频帧,但没有关于这些帧在缓冲区中的时间长度、丢失的帧数等信息。

因此,为了获取我AudioRecord.read()在循环中调用的帧数据,但如何判断特定帧是何时录制的?

我可以看到三种确定时间戳的方法,但在我看来它们都是错误的:

  1. 调用之前或之后AudioRecord.startRecording(),通过调用获取当前系统时间SystemClock.elapsedRealtimeNanos(),然后根据采样率和帧大小计算每个chunk的时间。但是根据我的测试,在录制实际开始之前有一个明显的延迟。每当某些帧丢失时,例如当处理暂停片刻时,时间也会变得不同步。

  2. 获取之前或之后的当前系统时间AudioRecord.read()。但这可能不是记录这些数据的时间,这可能发生得更早一些。如果还没有可用的数据, read() 将阻塞并且之前获取的时间戳将完全错误。

  3. AudioRecord.getTimestamp()给出当前正在录制的帧的时间。但这不一定是我当前正在阅读的帧,我可能落后几帧,或者我可能错过了一些帧。根据初始测试,在开始后的一段时间内,时间戳只是零。

这会给我留下 6 个可能错误的时间戳,如下面的代码所示。这些中的任何一个甚至接近准确吗?

recorder = new AudioRecord(...)

// timeBeforeStart =  SystemClock.elapsedRealtimeNanos()
recorder.startRecording()
// timeAfterStart =  SystemClock.elapsedRealtimeNanos()

...

// timeBeforeRead =  SystemClock.elapsedRealtimeNanos()
// recorder.getTimestamp(frameTimeBeforeRead, AudioTimestamp.TIMEBASE_BOOTTIME)
recorder.read(myArray, 0, mySize);
// recorder.getTimestamp(frameTimeAfterRead, AudioTimestamp.TIMEBASE_BOOTTIME)
// timeAfterRead =  SystemClock.elapsedRealtimeNanos()
Run Code Online (Sandbox Code Playgroud)

以下哪种方法是确定与字节数组中的数据对应的时间戳的最准确方法?

是否有不同的方法来检索具有准确时间戳的原始音频数据?

java android audio-recording audiorecord wear-os

7
推荐指数
1
解决办法
489
查看次数

计算IOrderedEnumerable而不消耗它

我想做什么,短版:

var source = new[]{2,4,6,1,9}.OrderBy(x=>x);
int count = source.Count; // <-- get the number of elements without performing the sort
Run Code Online (Sandbox Code Playgroud)

长版:

要确定IEnumerable中元素的数量,必须迭代所有元素.这可能是一项非常昂贵的操作.

如果可以将IEnumerable转换ICollection,则可以快速确定计数而无需迭代.LINQ Count()方法自动执行此操作.

函数myEnumerable.OrderBy()返回一个IOrderedEnumerable.一个IOrderedEnumerable显然不能被强制转换为ICollection的,因此调用COUNT()会消耗整个事情.

但排序不会改变元素的数量,IOrderedEnumerable必须保持对其源的引用.因此,如果该源是ICollection,则应该可以从IOrderedEnumerable中确定计数而不消耗它.

我的目标是有一个库方法,它接受带有n个元素的IEnumerable,然后例如检索位置为n/2的元素;

我想避免迭代IEnumerable两次只是为了得到它的计数,但我也想避免创建一个不必要的副本,如果可能的话.


这是我想要创建的函数的框架

public void DoSomething(IEnumerable<T> source)
{
    int count; // What we do with the source depends on its length

    if (source is ICollection)
    {
        count = …
Run Code Online (Sandbox Code Playgroud)

c# linq reflection performance ienumerable

6
推荐指数
1
解决办法
2566
查看次数

为App.config中的所有TraceSource添加默认的TraceListener

如何在net 4.0 c#项目中定义一个自动添加到所有TraceSource的默认TraceListener?

目前我必须列出我在App.config文件中使用的每个命名的TraceSource,如下所示:

  <system.diagnostics>
  <sharedListeners>
      <add name="MyListener" type="MyListenerType,MyAssemblyName" />
  </sharedListeners>
    <sources>
      <source name="Class1" switchValue="All">
        <listeners><add name="MyListener"></add></listeners>
      </source>
      <source name="Class2" switchValue="All">
        <listeners><add name="MyListener"></add></listeners>
      </source>
      <source name="Class3" switchValue="All">
        <listeners><add name="MyListener"></add></listeners>
      </source>
      ... repeat for a gazillion classes ...
    </sources>
  <system.diagnostics>
Run Code Online (Sandbox Code Playgroud)

我使用的SharedListener应该接收来自所有TraceSources的所有输出,除非另有说明.使用上述语法,这需要为每个TraceSource手动输入.

每当我介绍一个带有新TraceSource的新类时,我都必须更新App.Config.如果多个程序使用该程序集,我必须更新多个App.Config.更新这些条目时的拼写错误不会产生任何错误,它将默默地省略来自正确源的所有跟踪输出.

有没有办法可以通过App.config设置默认的TraceListener,所以如果我想偏离默认值,我只需要命名特定的TraceSources?

.net c# app-config system.diagnostics tracelistener

6
推荐指数
1
解决办法
1613
查看次数

仅当满足条件时才从 ConcurrentQueue 出列

ConcurrentQueue仅当满足某些条件时,如何才能将 a 的下一个元素出队?

例如,如果下一个要出列的项目满足特定条件,则将其出列,否则保留它。本质上是一个'DequeueIf'or'TryDequeueIf'方法

例子:

var myQueue = new ConcurrentQueue<int>()
...
int item;
// only dequeue if the next item is 0
bool success = myQueue.TryDequeueIf(out item, x=>x==0) 
Run Code Online (Sandbox Code Playgroud)

当然可以先调用TryPeek,检查条件,然后再调用TryDequeue,但这不再是线程安全的。

我可以将整个封装TryPeek & TryDequeue在一个锁中,但这有点违背了使用 ConcurrentQueue 的目的;并意味着所有常规无条件出队也必须被锁定。我不确定我是否需要锁定每一个Enqueue才能保存。如果可能的话,我想避免实现我自己的锁定策略时可能遇到的陷阱。

ConcurrentQueue是否有使用 .net4.0类或其他并发类之一的无锁解决方案?

c# queue concurrency multithreading locking

6
推荐指数
1
解决办法
3131
查看次数

从Logitech c920网络摄像头捕获15MP图像

我正在尝试用罗技c920拍摄1500万像素的图像.

该摄像机支持全高清(2.1 MP)视频和15MP静态图像.

使用提供的Logitech软件,我确实可以保存15MP图像.但是如果我通过DirectShow直接访问相机,我最多可以获得全高清分辨率.看起来相机卡在"视频"模式下.

我尝试了各种访问网络摄像头的例子,即RobotEyez,VLC,NirSoft WebCamImageSave.

我开始怀疑Windows下的网络摄像头的默认界面仅用于视频,并且没有官方的方式告诉摄像机拍摄分辨率高于视频流的静态图像.

如何在Windows下访问此类设备以捕获静态图像支持的完整15MP分辨率?

windows hardware webcam computer-vision logitech

6
推荐指数
0
解决办法
1311
查看次数

计算 Parallel.ForEach 使用的线程数

Parallel.ForEach如何确定(or Parallel.Invoke, or Parallel.For)的特定调用期间使用的线程数

我知道如何限制最大线程数,例如

Parallel.ForEach(myList, 
                 new ParallelOptions { MaxDegreeOfParallelism = 4 },
                 item => { doStuff(item); });
Run Code Online (Sandbox Code Playgroud)

我知道 Task.Parallel 库使用一些启发式方法来确定除当前线程之外在运行时使用的附加线程池线程的最佳数量;0 和 MaxDegreeOfParallelism 之间的某个值。

我想知道出于记录目的实际使用了多少线程:

Stopwatch watch = Stopwatch.StartNew();
Parallel.ForEach(myList, item => { doStuff(item); });
trace.TraceInformation("Task finished in {0}ms using {1} threads", 
       watch.ElapsedMilliseconds, NUM_THREADS_USED); 
Run Code Online (Sandbox Code Playgroud)

我主要是为了好奇而记录这些数据,并提高我的理解。它不必 100% 可靠,因为我不打算将它用于其他用途。

有没有办法获得这个数字,而不会对性能产生重大影响?

.net c# multithreading .net-4.0 task-parallel-library

6
推荐指数
1
解决办法
6313
查看次数

.editorconfig indent_size 的意外后果

使用.editorconfig文件,我可以配置 Visual Studio 应如何缩进代码。

现在,.NET 编译器平台的 .editorconfig 文件以及网络上的其他几个示例包含以下奇怪的注释:

[*]
indent_style = space
# (Please don't specify an indent_size here; that has too many unintended consequences.)
Run Code Online (Sandbox Code Playgroud)

在为所有文件类型定义默认缩进大小时,这么多意想不到的后果是什么?我是否也应该在自己的 .editorconfig 文件中避免这种情况,并且只为特定文件类型定义缩进大小?

定义默认缩进样式(制表符/空格)而不是默认缩进大小似乎很奇怪。

.net c# indentation editorconfig

6
推荐指数
1
解决办法
137
查看次数