我正在重写ASP.NET MVC中的PHP网站.我想保持相同的用户群,但使用PHP crypt()函数对密码进行哈希处理.我需要.Net中的相同功能,以便我可以在登录时散列密码并根据用户数据库中的散列密码进行检查.
在这种情况下,crypt使用CRYPT_MD5实现 - 哈希都以$ 1 $开头
我尝试了Phalanger,但它没有crypt功能的MD5实现.
有没有人知道.Net中的一个?CodeProject上的crypt()的C#示例使用DES,而不是MD5.
我在C#中尝试了以下代码,使用salt +密码,密码+ salt和salt的不同排列,使用和不使用$ 1 $前缀和$ suffix.None给出与PHP相同的结果:
static void Main(string[] args)
{
const string salt = "somesalt";
const string password = "fubar";
const string plaintextString = password + salt;
byte[] plaintext = GetBytes(plaintextString);
var md5 = MD5.Create("MD5");
byte[] hash = md5.ComputeHash(plaintext);
string s = System.Convert.ToBase64String(hash);
Console.WriteLine("Hash of " + password + " is " + s);
Console.ReadKey();
}
private static byte[] GetBytes(string s)
{
var result = new byte[s.Length];
for (int …Run Code Online (Sandbox Code Playgroud) 更新: 显然,您希望使用模板或基类而不是宏来执行此操作.不幸的是由于各种原因我不能使用模板或基类.
目前我正在使用宏来定义各种类的一堆字段和方法,如下所示:
class Example
{
// Use FIELDS_AND_METHODS macro to define some methods and fields
FIELDS_AND_METHODS(Example)
};
Run Code Online (Sandbox Code Playgroud)
FIELDS_AND_METHODS 是一个使用字符串化和令牌粘贴操作符的多行宏.
我想用以下类型的东西替换它
class Example
{
// Include FieldsNMethods.h, with TYPE_NAME preprocessor symbol
// defined, to achieve the same result as the macro.
#define TYPE_NAME Example
#include "FieldsNMethods.h"
};
Run Code Online (Sandbox Code Playgroud)
这里我#define类的名称(以前是宏的参数),FieldsNMethods.h文件包含原始宏的内容.但是,因为我是#including我可以在运行时进入代码,在调试时.
但是我TYPE_NAME在FieldsNMethods.h文件中" 预处理"和"标记粘贴" 预处理程序符号时出现问题.
例如,我想定义类的析构函数FieldsNMethods.h,所以这需要使用如下的值TYPE_NAME:
~TYPE_NAME()
{
//...
}
Run Code Online (Sandbox Code Playgroud)
但TYPE_NAME取而代之的是它的价值.
我正在尝试的是什么?我不能直接使用字符串化和令牌粘贴操作符,因为我不在宏定义中.
我有一个ASP.NET应用程序,它通过创建和写入自定义性能计数器来跟踪统计信息.有时,我会在错误日志中看到指示计数器无法打开,因为它们已在当前进程中使用过.我认为这是由于我的.NET appdomain已在同一个w3wp.exe进程中重置.当我的应用程序域被回收时,如何避免这些错误并重新建立与性能计数器的连接?
柜台建设:
PerformanceCounter pc = new PerformanceCounter();
pc.CategoryName = category_name;
pc.CounterName = counter_name;
pc.ReadOnly = false;
pc.InstanceLifetime =
PerformanceCounterInstanceLifetime.Process;
pc.InstanceName = instance_name;
Run Code Online (Sandbox Code Playgroud)
柜台使用:
pc.Increment()
Run Code Online (Sandbox Code Playgroud)
[2009年3月26日更新]收到的错误消息是:
实例'_lm_w3svc_1_root_myapp'已存在,其生命周期为Process.在删除它或使用它的进程退出之前,它不能重新创建或重用.已存在具有生命周期的过程.
我尝试通过初始化性能计数器并在瞬态AppDomain中写入其中一个来复制控制台应用程序中的异常.然后我卸载AppDomain并在第二个Appdomain中再次执行(相同的过程).他们都成功了.我现在不确定究竟是什么原因,我对ASP.NET中AppDomain回收的假设似乎是错误的.
Web应用程序的UI构建方式与桌面应用程序的UI不同.我很想知道在以下几个方面在两种应用程序样式之间构建UI的主要区别是什么:
1.使用技术
2.使用的技术
3.使用的控制
4.屏幕改变行为
我在我的代码中大量使用了boost :: scoped_ptr,它很棒,但我目前正在使用整个地方使用shared_ptr的软件,我想知道我是否遗漏了一些东西.
AFAIK a shared_ptr仅在不同的线程要访问相同的数据并且您不知道线程将完成的顺序时才有用(使用shared_ptr确保对象存在,直到最后一个线程完成它为止).
还有其他用例吗?
我想在asp:repeater的ItemDataBound事件期间获取数据绑定的项目.
我尝试了以下(在stackoverflow问题中这是一个不可接受的答案):
protected void myRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
Object dataItem = e.Item.DataItem;
...
}
Run Code Online (Sandbox Code Playgroud)
但是e.Item.DataItem没有.
如何在名为ItemDataBound的事件期间访问被绑定数据的项目.我假设事件ItemDataBound发生在一个项目是数据绑定时.
我想得到这个对象,所以我可以采取措施控制它的显示方式,此外该对象可能还有其他有用的属性,让我可以丰富它的显示方式.
工具有正确的答案.答案是e.Item.Data只有在e.Item.ItemType(Item,AlternatingItem)时才有效.其他时候它无效.在我的例子中,我在标题(或页脚)行期间收到ItemDataBound事件,其中没有DataItem:
protected void myRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
// if the data bound item is an item or alternating item (not the header etc)
if (e.Item.ItemType != ListItemType.Item &&
e.Item.ItemType != ListItemType.AlternatingItem)
{
return;
}
Object dataItem = e.Item.DataItem;
...
}
Run Code Online (Sandbox Code Playgroud) 在Windows系统托盘中选择"安全删除"选项后,是否有任何方法可以通过代码重新检测我的Flash,而无需将其插入并再次插入计算机USB端口?
根据MSDN:
如果未使用Start方法启动进程,则StartInfo属性不会反映用于启动进程的参数.例如,如果使用GetProcesses获取计算机上运行的进程数组,则每个进程的StartInfo属性不包含用于启动进程的原始文件名或参数.
好的,这很有道理.我的问题是,即使你使用Process.Start(),为什么这些参数都是空白的?
例如:
Dim startInfo As New ProcessStartInfo("firefox.exe")
startInfo.Arguments = "www.stackoverflow.com"
startInfo.WindowStyle = ProcessWindowStyle.Minimized
Process.Start(startInfo)
For Each proc As Process In Process.GetProcessesByName("firefox")
Debug.Print(String.Format("ProcessID={0}; Arguments={1}", _
proc.Id, proc.StartInfo.Arguments))
Next proc
Run Code Online (Sandbox Code Playgroud)
在这种情况下,即使我提供了Arguments,该属性仍为空:
替代文字http://www.sg-squared.com/images/startinfo.png
是什么赋予了?
我有一张像这样的桌子:
keyA keyB data
Run Code Online (Sandbox Code Playgroud)
keyA和keyB一起是唯一的,是我表的主键,并构成聚簇索引.
keyB有5个可能的值,但keyA的可能值不限.keyB通常递增.
例如,以下数据可以按两种方式排序,具体取决于首先订购的键列:
keyA keyB data
A 1 X
B 1 X
A 3 X
B 3 X
A 5 X
B 5 X
A 7 X
B 7 X
Run Code Online (Sandbox Code Playgroud)
要么
keyA keyB data
A 1 X
A 3 X
A 5 X
A 7 X
B 1 X
B 3 X
B 5 X
B 7 X
Run Code Online (Sandbox Code Playgroud)
我是否需要告知聚簇索引哪些键列具有较少的可能值,以允许它首先按该值对数据进行排序?或者在首先订购的性能方面无关紧要?
.net ×3
asp.net ×3
c++ ×2
appdomain ×1
boost ×1
database ×1
encryption ×1
flash ×1
include ×1
indexing ×1
macros ×1
performance ×1
php ×1
postgresql ×1
process ×1
raii ×1
repeater ×1
security ×1
shared-ptr ×1
sql ×1
sql-server ×1
usb ×1
windows ×1