小编klu*_*utt的帖子

散列真的是一个不可逆转的过程吗?

我一直在使用哈希和 RSA(在非常肤浅的层面上,例如:SSH 连接上的 RSA 身份验证),我想了解更多相关信息。

首先,我知道加密是一个可以恢复的双向过程。散列是一种不可逆转的单向过程。

最后一点对我来说没有意义,如果我使用算法来散列“你好”,不会是相同的算法,而是“反转”(意思是,它“向后”工作),能够转换该散列再次“你好”。

编辑:

感谢 @GeorgDangl、@klutt 和 Pete Kirkham 指出我根本不理解“不可逆数学”的概念。这些例子真的很有帮助。

security encryption hash aes sha

8
推荐指数
2
解决办法
4899
查看次数

C 关键字/函数是否未包含在 C++ 的 std 命名空间中?

以下代码在我的本地系统上运行良好,但在在线平台上引发了编译错误。

#include <iostream>

int32_t time[int32_t(1e5)];

int main()
{
    int32_t n;
    std::cin>>n;
    for(int32_t i=0;i<n;++i)
    {
        int32_t temp;
        std::cin>>temp;
        --temp;
        ++time[temp];
    }
    
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译错误描述

显然,错误是由于第 3 行int32_t time[int32_t(1e5)]; 而产生的但是,我无法理解为什么会发生编译错误。

我没有包含ctime或任何这样的标题,甚至没有解开std命名空间。但是仍然发生了编译失败。

我的系统上有带有 __cplusplus 201703 的 gcc 8.3.0。不确定在线平台上的版本是什么。

c++ std backwards-compatibility

8
推荐指数
2
解决办法
237
查看次数

按C中元素出现频率的降序排列数组

问题是根据元素的频率对数组进行排序.例如,如果输入数组是

   { 2, 3, 2, 4, 5, 12, 2, 3, 3, 3, 12 }
Run Code Online (Sandbox Code Playgroud)

然后将数组修改为:

   { 3, 3, 3, 3, 2, 2, 2, 12, 12, 4, 5 }
Run Code Online (Sandbox Code Playgroud)

我为此编写了代码并且它正常工作,但它使用了大量空间并且具有非常高的复杂性.

我对这个解决方案和我申请的逻辑不满意.如果有人帮助优化此代码或提供更好的逻辑.

我的代码是:

#define _CRT_SECURE_NO_WARNINGS // this line to work code in visual studio
#include <stdio.h>

int main() {
    /*
     * n = number of integer
     * i = loop variable
     * j = inner loop variable
     * c = number of distinct input
     * buf = temprary storage for input value …
Run Code Online (Sandbox Code Playgroud)

c arrays sorting frequency

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

How is assignments to compound literals useful?

I was reading about compound literals, and I saw that they are l-values. So I suspected that you can assign them, so I did an experiment and I noticed that this compiles without warnings with gcc -Wall -Wextra -pedantic:

struct foo {
    int x;
    int y;
};

int main(void) {
    (struct foo){0,0} = (struct foo){1,1};
}
Run Code Online (Sandbox Code Playgroud)

这让我感到困惑,因为我真的看不到任何可能有用的情况。当你会永远要分配什么一个复合文字?

或者它是常见的未定义行为之一?因为它看起来很像修改字符串文字。使用与上述相同的参数编译时没有警告:

struct foo *ptr = &(struct foo){0,0};
*ptr = (struct foo){1, 1};

char *str = "Hello";
*str = 'X'; // …
Run Code Online (Sandbox Code Playgroud)

c gcc compound-literals lvalue

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

如何将 for 循环的索引作为 pthread_create 的参数传递

我正在使用 for 循环来创建多个线程并将索引 i 作为参数传递,如下所示:

pthread_t p[count];
for (int i = 0; i < count; i++){
    pthread_create(&p[i], NULL, &somefunc, (void*)&i);
}
Run Code Online (Sandbox Code Playgroud)

然后我尝试检索 i 的值:

void *somefunc (void* ptr){
    int id = *(int*)ptr;
}
Run Code Online (Sandbox Code Playgroud)

但是,我注意到有时,线程中的 id 会有重叠的值,我怀疑这是由于在线程能够检索值之前 for 循环更新的索引(因为我传入了指针,而不是值本身)。有没有人有任何建议可以在不减慢 for 循环的情况下克服这个问题?

谢谢

c multithreading pthreads

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

为什么我不能通过这个指针黑客找到元素大小?

请考虑以下C语言

int arr[]= {1,2,3,4,5};
Run Code Online (Sandbox Code Playgroud)

我的系统使用4个字节来存储int数据.现在&arr[0] => 0022FEB0&arr[1]=>0022FEB4运行的那一刻

现在

int diff=&arr[1]-&arr[0];
Run Code Online (Sandbox Code Playgroud)

存储在DIFF值1而不是4.

为什么?

c arrays pointers

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

变量的编译时初始化如何在 c 内部工作?

编译时初始化仅在我们在变量声明期间为变量赋值时才发生。更具体地说,声明期间int a=2和声明后初始化变量有什么区别int a; a=2

c

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

int的大小,短,长,长长?

根据C99§5.2.4.2.1-1,以下类型的大小取决于实现。也就是说,它们的大小等于或大于以下值:

short           >= 8 bits
int             >= 16 bits
long            >= 32 bits
long long       >= 64 bits
Run Code Online (Sandbox Code Playgroud)

我一直听说这long是always 32-bits,并且严格等同于int32_t看起来错误的地方。

什么是真的?

c types c99

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

如何使用原始名称为库函数创建包装器?

我发现这个问题非常有趣:如果未检查函数返回值,如何强制编译错误?

如果您不检查返回值,将强制执行编译错误。我为该问题写了一个答案,您可以在其中使用gcc扩展,如下所示:

__attribute__ ((warn_unused_result)) int foo (void) 
{
    return 5;
}
Run Code Online (Sandbox Code Playgroud)

-Werror=unused-result如果您不使用返回值,则执行警告并进行编译以使编译器生成错误。

现在,我想为常规的标准函数创建包装函数。一个想法是这样重命名它们:

__attribute__ ((warn_unused_result)) realloc_wrapper(void *ptr, size_t new_size)
{
    return realloc(ptr, new_size);
}
Run Code Online (Sandbox Code Playgroud)

但是问题在于,这迫使我使用其他名称,这将导致大量搜索和替换。当然,这可以自动完成,但仍然可以。最好,我希望能够创建一个我可以使用的头文件,而不是任何程序的标准C头文件。一种用例是调试大型程序时。然后,这将立即使我指出潜在的错误原因。

TL; DR

简而言之,我希望能够采用此程序:

#include <stdlib.h>

int main(void)
{
    char *ptr;
    realloc(ptr, 42);
}
Run Code Online (Sandbox Code Playgroud)

并将其更改为:

// Replaced stdlib with a custom header
#include <mystdlib.h>

int main(void)
{
    char *ptr;
    realloc(ptr, 42);
}
Run Code Online (Sandbox Code Playgroud)

然后与的行realloc应生成警告。

我可能会补充说,我认为解决方案并非100%完美。预期用途是用于调试,而不是生产代码。

编辑:

我只是注意到这realloc是一个错误的选择,因为默认情况下似乎已经有了此声明,但是我使用了PSkocik并将其用于fgets

c gcc return-value

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

如何将视频内存从Python映射到C?

我一直在用 Python 处理一些简单的图形问题,但为了提高性能,我想用 C 做一些事情。

\n

我知道如何来回传输数组和内容。这没什么大不了的。但我认为,如果我可以创建一个带有画布的窗口,传递一个指向视频内存(当然不是物理视频内存)的指针,然后让Python负责将该内存放到屏幕上,那么这可能会很有用。其余的都是在 C 中完成的。可能是异步的,但我不\xcd\x84 不知道这是否重要。

\n

这可能吗?有意义吗?或者我完全走错了路?

\n

到目前为止我的努力:

\n
# graphics.py\n\nimport ctypes\nimport pygame\n\nscreen = pygame.display.set_mode((300,200))\n\nf = ctypes.CDLL('/path/to/engine.so')\n\nf.loop(screen._pixels_address)\n
Run Code Online (Sandbox Code Playgroud)\n

\n
// engine.c\n\n#include <stdint.h>\n\nvoid loop(void *mem) {\n    while(1) {\n        uint8_t *p = (uint8_t*) mem;\n      \n        // Was hoping this would make some pixels change\n        for(int i=0; i<20000; i++)\n            *p=127;\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这不起作用并最终导致崩溃。我并不感到惊讶,但是,这就是我到目前为止所得到的。

\n

并不是绝对有必要使用Python。但我确实想使用 C。而且我也知道,在大多数情况下,我的方法不是最好的方法,但我确实喜欢用 C 编码并做一些老派的事情。

\n

c python graphics python-3.x

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