Coda Hale的文章"如何安全地存储密码"声称:
bcrypt内置了盐来防止彩虹表攻击.
他引用了这篇论文,其中说在OpenBSD的实现中bcrypt
:
OpenBSD从arcfour(arc4random(3))密钥流生成128位bcrypt salt,并使用内核从设备时序收集的随机数据进行种子处理.
我不明白这是如何工作的.在我的盐概念中:
当我使用带有bcrypt的Devise(一个Rails登录管理器)时,数据库中没有salt列,所以我很困惑.如果盐是随机的并且没有存储在任何地方,我们如何可靠地重复散列过程?
简而言之,bcrypt如何内置盐?
能否解释一下,internal
C#中关键字的实际用途是什么?
我知道internal
修饰符限制了对当前程序集的访问,但我什么时候需要呢?
我一直想知道调试器是如何工作的?特别是可以"附加"到已经运行的可执行文件的那个.我理解编译器会将代码转换为机器语言,但是调试器如何"知道"它附加到什么?
R中的一种基本数据类型是因子.根据我的经验,因素基本上是一种痛苦,我从不使用它们.我总是转换为角色.我觉得奇怪的是我错过了一些东西.
是否有一些重要的函数示例使用因子作为分组变量,其中因子数据类型变得必要?我应该使用哪些因素?
虽然这个问题在实践中没有任何实际用途,但我很好奇Python如何进行字符串实习.我注意到以下内容.
>> "string" is "string"
>> True
Run Code Online (Sandbox Code Playgroud)
这是我所期待的.
你也可以这样做.
>> "strin"+"g" is "string"
>> True
Run Code Online (Sandbox Code Playgroud)
这非常聪明!
但你不能这样做.
>> s1 = "strin"
>> s2 = "string"
>> s1+"g" is s2
>> False
Run Code Online (Sandbox Code Playgroud)
为什么Python不会评估s1+"g"
,意识到它是相同的s1
并指向同一个地址?在最后一个块中实际发生了什么让它返回False
?
我过去几年一直在使用数据库,我想我已经相当有能力使用它们了.然而,我最近在阅读Joel的Leaky Abstractions法则,我意识到即使我可以编写一个查询来获取我想要的任何数据库,我也不知道数据库是如何实际解释查询的.有没有人知道任何解释数据库如何在内部工作的好文章或书籍?
我感兴趣的一些具体事情是:
.Net库中的许多方法都是在本机代码中实现的.那些来自框架本身的标记着[MethodImpl(MethodImplOptions.InternalCall)]
.来自某些非托管DLL的那些标记有[DllImport]
(例如[DllImport("kernel32.dll")]
).到目前为止没有什
但在为另一个问题写答案时,我发现有许多标记的方法[DllImport("QCall")]
.它们似乎是.Net的内部实现(例如GC._Collect()
).
我的问题是:究竟是什么[DllImport("QCall")]
意思?[DllImport("QCall")]
和之间有什么区别[MethodImpl(MethodImplOptions.InternalCall)]
?
Git与大多数其他版本控制系统之间的主要区别之一是,其他人倾向于将提交存储为一系列增量 - 一次提交与下一次提交之间的更改集.这似乎是合乎逻辑的,因为它是存储提交的最小可能信息量.但是,提交历史记录越长,比较修订范围所需的计算就越多.
相比之下,Git 在每个版本中存储了整个项目的完整快照.这并没有使回购规模显着每个提交成长的原因是项目中的每个文件存储在Git的子目录中的文件,名为对其内容的哈希值.因此,如果内容未更改,则散列未更改,并且提交仅指向同一文件.还有其他优化.
所有这些对我来说都是有意义的,直到我偶然发现有关包文件的信息,Git定期将数据放入其中以节省空间:
为了节省空间,Git使用了packfile.这是一种格式,其中的Git只会保存在第二个文件已经改变,它的指针是类似文件的一部分.
这基本上不会回到存储增量吗?如果没有,它有什么不同?这如何避免Git遇到其他版本控制系统遇到的相同问题?
例如,Subversion使用增量,回滚50个版本意味着撤消50个差异,而使用Git,您可以获取适当的快照.除非git还在packfiles中存储50个差异...是否有一些机制说"在经过一些少量的增量后,我们将存储一个全新的快照",这样我们就不会堆积太大的变更集?Git还有什么可以避免增量的缺点?
正在浏览.NET Framework Reference Source的 .NET源代码,只是为了它的乐趣.并找到了一些我不明白的东西.
有一个Int32.cs文件,其中包含Int32
类型的C#代码.不知怎的,这对我来说似乎很奇怪.C#编译器如何编译Int32
类型的代码?
public struct Int32: IComparable, IFormattable, IConvertible {
internal int m_value;
// ...
}
Run Code Online (Sandbox Code Playgroud)
但这在C#中不是非法的吗?如果int
只是别名 Int32
,则无法使用错误CS0523进行编译:
'struct1'类型的struct成员'struct2字段'在struct布局中导致循环.
编译器中有一些魔法,还是我完全偏离轨道?
我使用Python编程的时间已经超过半年了,而且我对Python内部结构更感兴趣,而不是使用Python来开发应用程序.目前我正在努力将一些库从Python2移植到Python3.但是,由于大多数更改都涉及Python2.x中的设计问题,因此我对如何将端口内容从Python2转换为Python3有一个相当抽象的观点.
我想了解更多关于Python内部的知识; 我应该采用自上而下还是自下而上的方式?有什么参考资料可以推荐吗?