我正在寻找安全存储密码的方法.有些人声称scrypt比bcrypt"更好",到目前为止,我看到没有人声称反之亦然,或者scrypt是不安全的,尽管有些人称之为"更有信誉".
scrypt比bcrypt有什么好处?根据scrypt网站的说法,"针对scrypt的硬件暴力攻击的成本大约是针对bcrypt的类似攻击的成本的4000倍".如果这是唯一的优势,那么我不能只使用更多轮次的bcrypt?
像'ps'和'top'这样的工具会报告各种内存使用情况,例如VM大小和Resident Set Size.但是,这些都不是"真正的"内存使用情况:
我发现Linux报告的私有脏RSS是最接近"真实"内存使用的东西.这可以通过对所有Private_Dirty
值求和来获得/proc/somepid/smaps
.
但是,其他操作系统是否提供类似功能?如果没有,有哪些替代方案?特别是,我对FreeBSD和OS X感兴趣.
假设我在类中有一个整数变量,并且该变量可能被其他线程同时修改.写入受互斥锁保护.我是否也需要保护读取?我听说有一些硬件架构,如果一个线程修改一个变量,另一个线程读取它,那么读取结果将是垃圾; 在这种情况下,我确实需要保护读取.我从未见过这样的架构.
这个问题假设单个事务只包含更新单个整数变量,因此我不担心可能也涉及事务的任何其他变量的状态.
每当我使用'ab'对Web服务器进行基准测试时,它会在发送大量请求后冻结一段时间,但仅在20秒左右后继续.
考虑以下用Ruby编写的HTTP服务器模拟器:
require 'socket'
RESPONSE = "HTTP/1.1 200 OK\r\n" +
"Connection: close\r\n" +
"\r\n" +
"\r\n"
buffer = ""
server = TCPServer.new("127.0.0.1", 3000) # Create TCP server at port 3000.
server.listen(1024) # Set backlog to 1024.
while true
client = server.accept # Accept new client.
client.write(RESPONSE) # Write a stock "HTTP" response.
client.close_write # Shutdown write part of the socket.
client.read(nil, buffer) # Read all data from the socket.
client.close # Close it.
end
Run Code Online (Sandbox Code Playgroud)
然后我按如下方式运行ab:
ab -n 45000 -c 10 …
Run Code Online (Sandbox Code Playgroud) 我正在使用旋转锁来保护非常小的关键部分.争用情况非常罕见所以自旋锁是比常规的互斥体更合适.
我目前的代码如下,并假设x86和GCC:
volatile int exclusion = 0;
void lock() {
while (__sync_lock_test_and_set(&exclusion, 1)) {
// Do nothing. This GCC builtin instruction
// ensures memory barrier.
}
}
void unlock() {
__sync_synchronize(); // Memory barrier.
exclusion = 0;
}
Run Code Online (Sandbox Code Playgroud)
所以我想知道:
__sync_lock_release
.我不是记忆障碍的专家,所以我不确定我是否可以使用它而不是__sync_synchronize
.我不在乎在所有有关争.有可能是1,也许2其他线程试图每过一次锁自旋锁天.
我正在考虑在Web服务器模块中集成多部分表单数据解析,这样我就可以解除后端Web应用程序(通常用动态语言编写)来解析多部分数据本身.多部分语法(RFC 2046)看起来并不重要,如果我手工实现它,很多事情都可能出错.是否已经有一个用C或C++编写的好的,轻量级的multipart/form-data解析器?我正在寻找除C或C++标准库之外没有外部依赖关系的那个.我不需要电子邮件附件处理或缓冲的I/O类或可移植性运行时或其他任何东西,只需要多部分/表单数据解析.
我考虑过的事情:
我还看过用Ragel编写一个解析器,但我无法弄清楚如何做到这一点,因为语法不是静态的:边界可以任意改变.
据我所知,对于TCP套接字,ECONNRESET与RST数据包有关.但是我在read()和write()调用上也看到了AF_LOCAL套接字的ECONNRESET错误.这是什么意思?ECONNRESET与read()返回0或write()抛出EPIPE有什么不同?
我正在尝试使我的WSGI服务器实现与Python 2和Python 3兼容.我有这样的代码:
def start_response(status, response_headers, exc_info = None):
if exc_info:
try:
if headers_sent:
# Re-raise original exception if headers sent.
raise exc_info[0], exc_info[1], exc_info[2]
finally:
# Avoid dangling circular ref.
exc_info = None
elif headers_set:
raise AssertionError("Headers already set!")
headers_set[:] = [status, response_headers]
return write
Run Code Online (Sandbox Code Playgroud)
......相关部分是:
# Re-raise original exception if headers sent.
raise exc_info[0], exc_info[1], exc_info[2]
Run Code Online (Sandbox Code Playgroud)
Python 3不再支持该语法,因此必须将其翻译为:
raise exc_info[0].with_traceback(exc_info[1], exc_info[2])
Run Code Online (Sandbox Code Playgroud)
问题:Python 2语法在Python 3中生成解析错误.如何编写可由Python 2和Python 3解析的代码?我尝试了以下,但这不起作用:
if sys.version_info[0] >= 3:
raise exc_info[0].with_traceback(exc_info[1], exc_info[2])
else:
eval("raise exc_info[0], exc_info[1], exc_info[2]; …
Run Code Online (Sandbox Code Playgroud) Linux内核lock; addl $0,0(%%esp)
用作写屏障,而RE2库xchgl (%0),%0
用作写屏障.有什么区别,哪个更好?
x86还需要读屏障指令吗?RE2将其读屏障功能定义为x86上的无操作,而Linux lfence
根据SSE2是否可用将其定义为无操作或无操作.什么时候lfence
需要?
我目前正在维护一些Web服务器软件,我需要执行大量的I/O操作.的read()
,write()
,close()
和shutdown()
电话,一个插座上使用时,有时可能会引发ENOTCONN
错误.这个错误究竟是什么意思?触发它的条件是什么?我似乎永远不会在本地重现它,但有用户可以.
现在我只是忽略ENOTCONN
了close()
,shutdown()
因为它似乎无害,但我不完全确定.
编辑:
connect()
电话成功了.我检查它的返回值.ENOTCONN
通常由close()
和提出shutdown()
.我很少见到read()
和write()
提高ENOTCONN
.sockets ×3
c ×2
c++ ×2
concurrency ×2
apachebench ×1
assembly ×1
bcrypt ×1
debugging ×1
freebsd ×1
linux ×1
macos ×1
memory ×1
multipart ×1
networking ×1
parsing ×1
posix ×1
python ×1
python-2.x ×1
python-3.x ×1
security ×1
spinlock ×1
throttling ×1
x86 ×1