小编Not*_*oti的帖子

C中的散列算法将16个字节值映射到2个字节值

我正在研究一个带有微控制器的电子项目,该微控制器用C编程.

我需要将一些ID及其相关信息存储在闪存(SD)中.这些ID长度为16个字节,因此有2 ^ 128个可能的值.虽然它们是16个字节,但只使用50000(唯一)值.在物理上不可能将所有可能的(2 ^ 128)ID存储在SD中.

我只能存储50000个已使用的值但是我必须遍历所有(最坏的)它们才能找到我需要的值.此外,必须为它们中的每一个计算16字节值的比较,这使得它非常慢.

所以我想我需要某种(hash?)函数将2 ^ 128值映射到50000(映射16字节到2字节).很明显,一些原始值将映射到相同的值/索引.我的想法是,当我得到一个ID时,我应用一个哈希函数,它给出了一个介于0和~50000之间(0-65535)的索引.使用该索引,我可以直接访问存储ID及其相关信息的SD扇区.正如我已经指出的那样,该索引将引用内存的位置,其中各种ID将共存,因为一些不同的ID被映射到相同的索引值.我必须找到正确的ID,但它只需要几个比较而不是50000个原始ID.

任何想法/意见都会非常感激.

提前致谢.

c algorithm hashmap

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

转向Carbon时,相同的QtOpenGL代码运行速度大约低15倍(vs Cocoa)

我正在为Mac OSX平台开发一个非常简单的应用程序,利用Qt和OpenGL(和QtOpenGL),因此跨平台变得更容易.
应用程序接收可变数量的视频流,这些视频流必须呈现给屏幕.这些视频流的每个帧用作用于在3D空间中映射矩形的纹理(非常类似于视频墙).除了接收,锁定,上传视频数据,同步线程之类的东西......我认为很明显它是一个非常简单的应用程序.

事实是,当在10.5 Mac中使用基于可可的Qt 4.7二进制文件(默认值)时,一切都表现良好.但是我的代码必须在从(并包括)10.4开始的所有OSX版本中运行良好.所以我在10.4机器上尝试了代码,它在启动时崩溃了.经过几个小时的互联网阅读后,我发现,对于目标为10.4的Qt应用程序,必须使用碳Qt.所以我用新框架重建整个项目.
当新生成的二进制文件运行时,一切正常,除非应用程序的fps下降到大约2 fps!并且它在两台机器上的行为相同(10.5计算机具有明显更好的功能)我花了很多时间研究这个但我还没有达成解决方案.有什么建议?

有关应用程序和我尝试过的事情的更多信息

  • 重新编译碳时,代码尚未修改
  • 只使用了两个(256x256纹理)视频,以确保它不是带宽限制问题(虽然我知道它不应该因为第一个代码工作)
  • 2个视频流来自网络(本地)
  • 当视频流到达时,会发出信号并将数据上传到OpenGL纹理(glTexSubImage2D)
  • 计时器使渲染(paintGL)发生在大约20ms(~50 fps)
  • 渲染代码使用纹理(更新或不更新)来绘制矩形.
  • 仅当视频到达时才能呈现,因为有2个(异步)视频流; 除了必须在屏幕上绘制更多的东西.
  • 只使用基本的OpenGL命令(没有PBO,FBO,VBO ......)唯一有问题的可能是使用着色器(仅在Qt 4.7中提供),但它的代码很简单.
  • 我使用了OpenGLProfiler和Instruments.没有观察到任何特殊/奇怪的东西.

我怀疑的一些事情(结论)

  • 很明显,这不是硬件问题.同一台计算机的行为也不同
  • 它让我感觉它是一个线程/锁定问题,但为什么呢?
  • 碳是32位.10.5应用程序是64.它不可能开发64位碳.
  • 为了给出32位可能的原因,我还重建了32位的第一个项目.它的工作原理相同.
  • 我已经阅读了关于碳有问题(比平常更多)与上下文切换的东西.
  • 也许OpenGL实现是多线程而代码不是?(或相反的?)这可能会导致很多失速.
  • 也许碳处理事件与可可的不同?(我的意思是信号/事件调度,主循环...)

好吧,这是(抱歉这么久的写作)我的实际头痛.任何建议,想法..将非常感激.

Thx提前.

opengl macos cocoa qt macos-carbon

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

标签 统计

algorithm ×1

c ×1

cocoa ×1

hashmap ×1

macos ×1

macos-carbon ×1

opengl ×1

qt ×1